+ Closure

- Swift 클로저는 세 가지 형태를 가지고 있음

1. 기본적인 형태
{ (파라미터 목록) -> 리턴형 in 실행할 코드 } or  { 실행할 코드 }

예1 

let simpleClosure = { (str: String) -> String in

    return "Hello, \(str)"

}


let result = simpleClosure("Swift Closure")

print(result)


예2 ) 

let simpleClosure = { print("Hello, Swift") }


simpleClosure()



- 클로저를 파라미터로 받는 함수

fun performClosure ( _ co: (String) -> (String) ) {

let result = co("Swift Closure")

print(result)

}


호출1 : 변수나 상수 전달

performClosure( simpleClosure )

호출2 : 인라인 클로저

performClosure( { (str: String) -> (String) in

    return "Hello2, \(str)"

} )



- 인라인 클로저의 경우 파라미터와 리턴형 추론 가능

예)

performClosure( { str in

    return "Hello3, \(str)"

})


- 암시적 리턴 (return 키워드 생략 가능, 인라인 클로저가 하나의 return명령문으로 구현되어있을 때만)

예)

performClosure( { str in

    "Hello4, \(str)"

})


- 클로저 내부에서 사용할 수 있는 축약된 인자이름 제공, 첫 번째 인자의 이름은 $0, 두 번째 인자의 이름은 $1 ..., 축약된 인자 이름 사용 시 파라미터 이름과 in 키워드를 생략가능

예 )

performClosure( { "Hello5, \($0)" })


2. 연산자 함수

- 클로저가 두 개의 파라미터를 비교한 후 결과를  Bool로 리턴한다면 인라인 클로저를 연산자 함수로 태체가능.

예1 ) 컬렉션을 정렬할 때 사용하는 sort 함수를 구현

let numbers = [1, 7, 23, 5, 8, 3, 6]

let orderedNumbers = numbers.sorted(by: { (lhs: Int, rhs: Int) in

    return lhs < rhs

} )


예2 ) 연산자 함수로 대체

let orderedNumbers2 = numbers.sorted(by: <)


3. Trailing Closure

- 인라인 클로저는 함수 호출 구문에 포함되는 형태이므로 클로저의 구현 부분이 단순한 경우에 적합

- 클로저의 구현이 복잡한 경우에는 트레일리 클로저로 구현하는 것이 좋음

- 인라인 클로저와 트레일링 클로저의 가장 큰 차이는 클로저가 포함되는 위치

1. 인라인 클로저는 함수 호출 시 사용하는 괄호 내부에 위치

예 ) 

performClosure( {( "Hello InlineClosure, \($0)")} )

2. 트레일링 클로저는 괄호 이후에 위치

예 )

performClosure() { "Hello TrailingClosure, \($0)" }


- 클로저가 함수의 마지막 파라미터로 전달되는 경우에만 사용가능

- 함수 이름 다음에 바로 {}가 온다면 이 함수는 하나의 파라미터를 가지고 있고, 트레일링 클로저라는 것을 직관적으로 유추할 수 있어야함 (함수와 혼동 할 수도 있기 때문)


- Swift 클로저는 외부에 선언되어 있는 변수를 클로저에 선언되는 시점에 변수의 참조가 클로저 내부로 전달되어 클로저 내부 또는 외부에서 값을 변경할 경우 동일한 값으로 변경됨


'Swift > Swift Basic (3.0Base)' 카테고리의 다른 글

Date  (0) 2017.02.17
String  (0) 2017.02.17
Tuple (튜플)  (0) 2017.02.10

Swift에서 가장 많이 쓰이는 HTTP 라이브러리인 Alamofire


https://github.com/Alamofire/Alamofire

'Swift > ' 카테고리의 다른 글

UserDefaults 와 Array  (0) 2017.09.22
텍스트 필드에서 숫자만 입력받기  (0) 2017.09.03
UITextView Placeholder  (0) 2017.08.19
StatusBar hidden 하기 (Swift)  (0) 2015.04.08
swiftdoc.org  (0) 2015.01.20

override func prefersStatusBarHidden() -> Bool {

    return true;

}

'Swift > ' 카테고리의 다른 글

UserDefaults 와 Array  (0) 2017.09.22
텍스트 필드에서 숫자만 입력받기  (0) 2017.09.03
UITextView Placeholder  (0) 2017.08.19
HTTP Networking Framework - Alamofire  (0) 2016.02.03
swiftdoc.org  (0) 2015.01.20

Swift Documentation 열람 사이트


http://swiftdoc.org/

'Swift > ' 카테고리의 다른 글

UserDefaults 와 Array  (0) 2017.09.22
텍스트 필드에서 숫자만 입력받기  (0) 2017.09.03
UITextView Placeholder  (0) 2017.08.19
HTTP Networking Framework - Alamofire  (0) 2016.02.03
StatusBar hidden 하기 (Swift)  (0) 2015.04.08
  • 함수 (Function)
    • func <함수이름> (<파라미터 이름>: <파라미터 자료형>)-> <리턴형> { ...... }
    • 반환 타입
      • 파라메터 뒤에 "->" 로 반환타입임을 의미할 수 있다
      • 반환 값이 없을 경우 반환 타입을 포함하지 않음
      • 여러 개의 반환 값 정의 시 ","로 구분되는 복수 입력 반환 타입을 가질 수 있음
        • -> (반환이름 : 반환타입, 반환이름 : 반환타입)
      • 반환 타입의 이름은 꼭 정의 하지 않아도 됨
        • 반환값이 정의 되어있지 않은 함수는 void 타입의 특수값을 반환, ()로 쓰여질 수 있는 빈 튜플(Tuple) 요소를 갖고 있지 않은 튜플
    • 파라메터
      • 함수 이름 다음 괄호 안에 ","로 구분되는 복수 입력 파라메터를 가질 수 있음
      • 파라메터를 받지 않는 다고 하여도 함수 이름 뒤에 "()"를 포함해야 함
      • 함수 파라메터는 함수 내에서만 사용 가능 (지역 파라메터 라고도 함)
      • 함수 인수가 어떤 목적인지 지시하기 위해 함수 사용자에게 파라메터 이름을 제공 할 수 있음, 이를 외부 파라메터 이름(External Parameter Names)라고 하며, 지역 파라메터 이름 앞에 공백으로 구분해서 작성하면 된다.
        • func testFunction(EPName aName:String) {...}
      • 지역 파라메터 이름이 적절하다 싶으면 파라메터 이름 앞에 "#"을 붙이게 되면 외부 파라메터 이름으로도 사용 가능(2.0에서 삭제)
      • 파라메터들은 기본값을 가질 수 있음
        • func testFunction(aName:String = "UNNOWN") {...}
      • 가변 개수 파라메터, "..."키워드를 사용하여 특정 타입의 값을 0개 이상 받을 수 있음
        • func testFunction(nums:double...) {...}, 입력 시 : testFunction(1, 2, 3, 4)
        • 내부에는 double[] 타입의 배열로 만들어 짐
        • 함수는 한개의 가변 개수 파라메터를 가질 수 있음
        • 파라메터 목록의 맨 마지막에 배치
        • 기본 값을 가지는 파라메터 맨 마지막에 두어야 함
      • 함수의 파라메터들은 기본적으로 상수들 임, 가변 파라메터를 정의 하려면 "var" 키워드를 접두어로 사용
        • func testFunction(var aName:String = "UNNOWN") {...}
        • 가변 파라메터는 함수 호출 동안만 유지
      • In-Out 파라메터
        • 함수 내에서만 변경되면 원래의 값을 대체함
        • "inout" 키워드를 접두어로 사용
        • 주소연산자 "&" 붙여 파라메터로 넘겨준다 (C/C++ 다뤄 봤음 알 듯)
        • 파라메터로 넘길 수 있는 값은 인수(argument)뿐, 상수나 문자값은 파라메터로 넘길 수 없음
        • 기본 값을 가질 수 없으며, 가변 개수 및 var, let으로 표시 또는 사용할 수 없음
      • 파라메터 이름 앞에 공백과 "_"를 사용하게 되면 함수 사용 시 파라메터 이름을 생략 할 수 있다 (Omitting External Parameter Names, 2.0에 추가)
      •  Optional Tuple Return Types, 2.0에 추가

    • 함수 타입
    • 중첩 함수 


'Swift > Swift Basic (2.0Base)' 카테고리의 다른 글

Optionals  (0) 2014.12.30
튜플(Tuples)  (0) 2014.12.24
로그 출력  (0) 2014.12.23
변수와 상수  (0) 2014.12.23
Swift특징  (0) 2014.12.23
  • Optionals
    • Swift에서 "값이 없음"을 처리하는 새로운 개념
    • nil 값을 가질 수 있는 참조 형식과 값 형식을 옵셔널 형식(Optional Type)이라고 한다.
    • 기본적으로 nil로 초기화 되고, 언제든지 필요한 값을 할당하거나 nil을 재할당 할 수 있음
    • 반대로  nil값을 가질 수 없는 나머지 형식들은 비옵셔널 형식(Non-Optional Type)이라고 한다.
    • 예) 
      • var optionalNum: Int? = nil
      • var optionalStr:String? = "hello"
    • 옵셔널 형식의 값을 사용할 때는 변수명 뒤에 느낌표를 붙여 강제 추출(Forced Unwrapping)연산사를 사용할 수 있다
    • 예)
      • var userName: String? = getName();
      • if userName != nil { println("\(userName!)") }
    • 옵셔널 형식이 항상 유효한 값을 가지는 경우에는 자료형 뒤에 물음표(?) 대신 느낌표(!)를 붙여서 암시적으로 추출되는 옵셔널 형식(Implicitly Unwrapped Optionals)으로 선언할 수 있다.
    • 값이 nil인 경우 런타임 오류가 발생
    • 예)
      • var userName: String!= "kim"
    • 옵셔널 바인딩(Optional Binding)은 nil테스트와 값 추출을 한번의 동작으로 처리해주는 패턴으로 if let 문법을 사용
    • 예)
      • if let userName = getName() { ... }
    • if 문 내에서 값의 조작이 필요할 경우 if var로 선언 가능
    • Nil Coalescing 연산자는 옵셔널 형식에 저장된 값을 추출하거나, 옵셔널 형식이 nil인 경우 사용할 기본값을 지정 한다.
    • 이항 연산자로 a ?? b 와 같은 형태로 사용
    • 왼쪽 피연자에는 옵셔널 형식의 데이터 또는 표현식
    • 오른쪽에는 피연산자가 nil일 경우 리턴할 기본값 또는 표현식 (함수호출이나 연산자가 될 수도 있다)
    • 예)
      • var userName = getName() ?? "Jun"
    • Optional Chaining 정리 중..


'Swift > Swift Basic (2.0Base)' 카테고리의 다른 글

함수  (0) 2015.01.08
튜플(Tuples)  (0) 2014.12.24
로그 출력  (0) 2014.12.23
변수와 상수  (0) 2014.12.23
Swift특징  (0) 2014.12.23
  • 튜플(Tuples)
    • 두 개 이상의 값으로 구성된 복합값을 나타낸다.
    • 형식추론 예 
      • let member = (21, "kim", "seoul", "010-1212-2222")
    • 자료형 명시 예
      • let member: (Int, String, String, String) = (21, "kim", "seoul", "010-1212-2222")
    • 튜플의 각 요소에 저장된 값을 읽을 때는 인덱스를 사용
    • 튜플의 각 요소는 읽기 전용
    • 예 : let memberName = member.1        //kim
    • 각 요소를 개별 상수와 연관시켜 접근하는 방법
      • let (id, name, address, phone) = member
    • "_" 문자를 사용해서 해당값 사용하지 않도록 표시
      • let (id, name, _, _) = member
    • 요소의 이름 지정
      • let member = (id: 21, name: "kim", address: "seoul", phone: "010-1212-2222")
      • let memberId = member.id


'Swift > Swift Basic (2.0Base)' 카테고리의 다른 글

함수  (0) 2015.01.08
Optionals  (0) 2014.12.30
로그 출력  (0) 2014.12.23
변수와 상수  (0) 2014.12.23
Swift특징  (0) 2014.12.23

println() : 출력 후 자동으로 줄바꿈

print() : 출력만 줄바꿈 없음

'Swift > Swift Basic (2.0Base)' 카테고리의 다른 글

함수  (0) 2015.01.08
Optionals  (0) 2014.12.30
튜플(Tuples)  (0) 2014.12.24
변수와 상수  (0) 2014.12.23
Swift특징  (0) 2014.12.23

+ Recent posts