-
Self Type - GeneraliOS/🟠 Swift 2020. 11. 27. 23:40
" 컴파일러가 컨텍스트에 의해 추론하는 타입 " *Self Type 은 타입 입니다. 속성 self 와는 다른 개념입니다. extension Int { static let zero: Self = 0 // Int 로 추론됩니다. var zero: Self { // Int 로 추론됩니다. return 0 } func makeZero() -> Self { return Self() // Int 로 추론되어 Int 인스턴스를 반환합니다. } } Extension, Struct, Class, Enum, Protocol 에서 사용 가능합니다. Protocol 의 경우, Protocol 을 구현한 타입을 Self Type 으로 추론합니다. Self Type 의 장점은, 타입에 의존하지 않는 범용적인 코드를 만들 수 있..
-
[Swift] Property Observer (속성 감시자) 란?iOS/🟠 Swift 2020. 11. 27. 23:18
1차 수정: 2021/06/02 "속성값의 변경을 감시한다" 안녕하세요. 이번시간은 속성 감시자에 대해서 알아보겠습니다🐶 처음에는 문법 정도만 적은 글이었는데, 배우다 보니 적고싶은 내용이 많아져서 추가하게 되는 것 같아요. 그럼 시작해볼게요!! 속성 감시자(Property Observer) 는 속성(Property) 이 새로운 값으로 변경 될 때 호출 되는 코드 블럭입니다. 블록만 추가해 놓으면 속성이 변경될 때마다 호출되어서 속성감시자를 사용하면 이벤트에 대응하기 쉽습니다. var observingValue: String = "Hello" { didSet { self.textLabel.text = observingValue } } 위의 코드를 예로 들자면, observingValue 라는 String..
-
Side Effect - GeneraliOS/🟠 Swift 2020. 11. 24. 10:05
값이나 상태의 변경이 일어남을 의미 논리식에서 side effect가 발생할수 있는 코드를 살펴보겠습니다. var a: Int = 1 var b: Int = 2 func addA (val: Int a){ a += 1 return true } func addB (val: Int b){ b += 1 return true } // short circuit 으로 addB()가 호출되지 않는다 if addA() || addB() { print(a) // 2 print(b) // 1 } 따라서 의도하지 않은 논리적 오류가 발생할 수 있으므로 꼭 필요한 경우가 아니라면 조건식에서 함수를 호출하는 코드는 지양해야 합니다. 끝. 이전 글: Nested Functions - Functions Nested Functions..
-
Nested Functions - FunctionsiOS/🟠 Swift 2020. 11. 8. 19:10
"함수 블록 내부에 정의된 함수" Example Code func outer() -> () -> () { print("outer") // "outer" var a: Int = 3 func inner(){ print("inner") // "inner" print(a)// 3 -> Nested Function의 Scope : outer local block } return inner } let f = outer() f() outer 블록 외부에서 inner 에 접근 하는 방법 위 코드와 같이 inner를 리턴함으로서 간접적 Scope 확장을 통해 inner에 접근할 수 있습니다. 끝. 이전 글: Function Types - Functions Function Types - Functions Function ..
-
Function Types - FunctionsiOS/🟠 Swift 2020. 11. 8. 16:25
Function Types는 변수나 상수에 함수를 assign 하는 경우, 타입을 명시할 때 필요합니다. Swift에서 함수는 first-class citizen 이므로, 변수나 상수에 함수를 assign 할 수 있습니다. 이전 글에서 Function Notation만을 이용하여 타입 추론을 통해 저장하였지만, 함수도 자료형을 가지고 있으므로 명시적으로 변수 혹은 상수에 타입도 표기할 수 있습니다. 또한 클로저를 파라미터로 받는 코드를 이해하기 위해 Function Types을 이해하는 것은 필요합니다. Syntax /* Function Types */ (type) -> type () -> () // () -> void 로도 표기할 수 있습니다. Function에서 쓰는 void 는 리턴형이 없다는 것을..
-
[Swift] Function Notation - FunctionsiOS/🟠 Swift 2020. 11. 8. 11:32
" 함수표기법 " 안녕하세요. 오늘은 함수 표기법에 대해 알아보겠습니다. 👀 스위프트에서 함수 표기법은 크게 두 가지 경우에 필요합니다. 1. 오버로딩 된 함수를 구분하여 부를 필요가 있을 때 2. 일급객체로서 변수 혹은 상수에 저장할 때 함수를 표현하는 기본적인 방법 개발자 사이트(테크블로그)나, 레퍼런스에서는 함수를 아래와 같이 표기합니다. /* Function Notation */ random(in:) print(_:seperator:terminator:) 1. 오버로딩 된 함수를 구분할 때 파라미터가 없는 함수의 경우 Function Name만 사용하여 표기합니다. 그렇지 않은 경우, Argument Label을 ' : ' 로 구분하여 입력합니다. 위 이미지에서 Xcode는 Argurment La..
-
Variadic Parameters - FunctionsiOS/🟠 Swift 2020. 11. 7. 16:54
"가변 파라미터" func example(name: Type...) { ... } 하나의 Parameter에 같은 데이터 타입을 가진 여러 개의 값을 Argument로 전달할 수 있습니다. 예를 들어, print(_:seperator:terminator:) 를 보겠습니다. /* print(_:seperator:terminator:)의 prototype */ public func print(_ items: Any..., separator: String = " ", terminator: String = "\n") 첫 번째 Parameter를 Variadic Parameters로 선언하였습니다. Any... 이므로 , 어떤 타입이든 개수에 상관없이 넣을 수 있습니다. Variadic Parameter의 제약사..
-
Argument Label - FunctionsiOS/🟠 Swift 2020. 11. 7. 13:23
func example (label name: Type) { // label: Argument Lable, name: Parameter Name .... } 따로 정의하지 않을 시, Parameter Name이 Argument Lable이 됩니다. 함수를 호출할 때는 Argument Label을 사용해야 합니다. Parameter Name은 함수 호출에 사용할 수 없습니다. Parameter Name은 함수 Body에서 사용합니다. example(label: expr)// 함수 호출 시 Argument Label을 이용해야 합니다. /* WildCard Pattern */ func example2 (_ name: type) { ... } example2(expr) // WildCard Pattern을 이..
-
In-Out Parameters - FunctionsiOS/🟠 Swift 2020. 11. 6. 16:04
"입출력 파라미터" 함수 Argument에 값 전달 시, Parameter는 임시 상수로서 값을 복사합니다. ( immutable ) 실제로 전달한 Argument의 값을 변경하고 싶을 때, inout을 사용합니다. c++의 참조자와 비슷한 기능을 합니다. /* 정의부 */ func example(name: inout Type) { ... } /* 호출부 */ example(name: &expr) //전달할 값에 &를 붙여 전달합니다. 주의할 점 1. 리터럴을 전달하면 안됩니다. 리터럴은 메모리 공간이 따로 없습니다. 2. 상수를 전달하면 안 됩니다. immutable입니다. 3. 가변 파라미터를 전달할 수 없습니다. 4. 기본 값을 지정할 수 없습니다.