'Technical Stubs/Apple Swift'에 해당되는 글 11건

  1. 2014.09.18 함수 호출 문법에서 missing arguments labels가 나올 때
  2. 2014.08.12 Swift - Closures
  3. 2014.08.11 Swift - Function
  4. 2014.08.11 Swift - Control Flow
  5. 2014.08.08 Swift - Data Type #Collections
  6. 2014.08.08 Swift - String
  7. 2014.08.08 Swift - Operators
  8. 2014.08.08 Swift - Data Type #Tuple
  9. 2014.08.08 Swift - Data Type #Optionals
  10. 2014.08.08 Swift - Data Type #General
2014.09.18 16:48

함수 호출 문법에서 missing arguments labels가 나올 때

Swift Programming을 하다보면 XCode의 문법 자동 확인 기능을 이용하게 된다. 특히, 함수 호출에 있어서는 더욱 많이 사용하게 되는데 간혹 다음과 같은 메시지를 보여주면서 문법이 잘못되었다는 표시가 되는 경우가 있다.


[그림] Missing argument labels



Xcode에서 제공하는 오류 자동 수정 기능으로, greet 함수를 호출 할 때 day라는 라벨을 붙지지 않고 있는게 이슈가 되므로 day:를 붙여 넣으라는 내용이다. 클릭하면 자동으로 day: 를 붙여 준다. 


[그림] 수정된 greet 함수 호출



그런데, 이 greet이라는 함수를 선언한 곳을 보면 다음과 같다.


[그림] greet 함수 선언



이 함수는 A Swift Tour에 나오는 예제인데, 함수 호출 시 별도 argument name 없이 사용할 수 있음을 보여준다.


[그림] Functions and Closures



이 문서에는 argument label을 붙이지 않은 그대로 greet("Bob", "Tuesday")와 같이 호출하고 있다. 그런데, 왜 XCode에서는 문법이 잘못 되었다고 표시가 되었을까?


Swift Tour의 예제가 Playground에서만 동작하고 App을 만들 때 사용하는 Project Code에서는 안되는 걸까?

아니면 argument label을 호출할 때 첫 번째 argument는 생략해도 되는 걸 보면 기존 Objective-C 코드를 재활용할 때는 못쓰는걸까?



사실 여기에는 함수(Function)에 대한 함정(?)이 숨어 있는데 앞서 호출하는 greet은 엄밀하게 이야기하면 함수(function)가 아닌 메소드(method)이다.


Swift Language Spec 문서에 의하면 메소드는 type이 관여된 것으로 함수지만, class에 속해 있는 경우 parameter의 노출에 대한 기본 정의가 여느 함수 정의에서와 달리 다르다고 한다.


Local and External Parameter Names for Methods

Function parameters can have both a local name (for use within the function’s body) and an external name (for use when calling the function), as described in External Parameter NamesThe same is true for method parameters, because methods are just functions that are associated with a type. However, the default behavior of local names and external names is different for functions and methods. 


...


Specifically, Swift gives the first parameter name in a method a local parameter name by default, and gives the second and subsequent parameter names both local and external parameter names by default.


[출처] Apple Swift Programming Language - Methods


스펙을 더 자세히 들여다 보면, 메소드는 첫번째 local parameter로 그리고 두 번째 부터는 local과 external 둘다 제공하는것을 기본으로 한다. 따라서, 앞서 greet 함수 아니 greet 메소드는 다음과 같이 첫 번째 parameter인 name은 local로 그리고 두 번째 parameter인 day는 #을 추가하여 external로 사용될 수 있는 모습이 된다.

[그림] greet method



그렇다면, 메소드를 여느 함수와 같이 external로 제공하지 않으려면 어떻게 할까? greet 함수의 경우에서처럼 day: 라는 별도 label을 없이 호출하고 싶은 경우 말이다.


Swift 함수 spec에서는 external parameter를 명시적으로 제공하고 싶지 않는 경우는 underscore 문자인 '_' 를 앞에 붙여서 선언한다. 따라서, method에서도 마찬가지로 명시적으로 '_'를 day 앞에 추가하면 argument 이름없이 호출이 가능하다.



[그림] Underscore 문자 '_' 를 사용한 external parameter 감추기


정리를 하자면 parameter 이름 노출에 있어서 함수는 기본 동작으로 underscore '_' 로 인식하고 메소드는 기본 동작으로 sharp '#'으로 인식한다.


여담으로 그냥 Playground에서도 일반적인 함수가 아닌 Class를 생성 후 method로 호출하면 Project에서와 동일한 동작을 하며, Class를 선언하는 Swift 파일에서도 Class 선언부 바깥에 함수를 선언하는 경우는 method가 아닌 함수로 선언되므로 사용에 주의 하기 바라니다.

'Technical Stubs > Apple Swift' 카테고리의 다른 글

함수 호출 문법에서 missing arguments labels가 나올 때  (0) 2014.09.18
Swift - Closures  (0) 2014.08.12
Swift - Function  (0) 2014.08.11
Swift - Control Flow  (0) 2014.08.11
Swift - Data Type #Collections  (0) 2014.08.08
Swift - String  (0) 2014.08.08
Trackback 0 Comment 0
2014.08.12 11:21

Swift - Closures


Closures

클로져는 사용자 코드에서 다른 코드나 함수로 전달 될 수도 있고, 또 그 자체가 사용되어 질 수 있는 기능에 대한 자립적인 블럭을 말한다.

또한, 클로저에는 클로저가 정의된 곳의 context로 부터 상수나 변수에 대한 reference를 수집(capture)하거나 저장(store) 가능한데 이를 두고 변수나 상수를 closing한다라는 표현을 사용하기에 closures라는 이름으로 불린다.


reference capturing 에 대한 부분은 별도로 설명하고 있으나 간략하게 정리하면, 클로저가 해당 변수나 상수를 지속적으로 참고하고 있으며, 변수일 경우 해당 정보의 변경에 대한 정보를 지속적으로 얻을 수 있는 것을 말한다.


Global 함수와 nested 함수가 closure에 대한 특별한 모습이라 할 수 있으며, 클로져는 다음 세 가지 중 하나의 모습을 갖게 된다.

  • Global 함수는 이름을 갖고 어떠한 값도 수집하지 않는 클로져이다
  • Nested 함수는 이름을 가지고 해당 함수를 포함하는 함수의 값을 수집 할 수 있는 클로져이다
  • 클로져 expression은 이름이 없는 클로져로, 해당 클로져를 포함하는 context의 값을 수집 할 수 있도록 간략한 형태이다

Closures Expressions

Closure Expressions은 syntax를 중점으로 inline closure를 간략하게 작성하는 방법을 말한다.
Closure Expressions은 명료함과 의도에 대한 손실 없이 클로저를 가장 단순화 할 수 있는 몇몇의 최적화 syntax를 제공한다.

Closure Expression을 잘 설명하기 위해 sorted 함수를 먼저 소개를 한다.
  • The Sorted Function
    • Swift 표준 라이브러리에는 sorted라는 이름의 함수를 제공한다
    • 이는 프로그래머가 제공한 클로저 함수의 결과를 기준으로 주어진 타입의 Array의 값을 정렬 해 주는 함수이다.
    • 호출이 완료되면 sorted 함수는 기존 입력했던 Array와 동일한 타입과 크기의 정렬된 array를 생성하며 원본은 변하지 않는다.
    • sorted 함수는 다음 두 가지 정보를 argument로 입력 받는다
      • 알고 있는 타입 값의 Array
      • Array 에 담고 있는 값의 타입과 동일한 타입 두 개를 argument로 그리고 리턴 타입으로 앞서 입력 받은 타입을 비교하여 그 결과에 대해 true 또는 false를 리터하는 클로저 타입
    • 예를 들어 문자열 Arrary라면 다음과 같다
      • let names = ["Hello", "World", "Swift", "Programming"]
    • 이럴 경우 클로져 타입은 (String, String) -> Bool 이 되고
      • func backwards(s1: String, s2: String) -> Bool {
      •   return s1 > s2
      • }
      • var reversed = sorted(names, backwards)

이제 Closure Expression 에 대해 자세히 설명하겠다
  • Closure Expression Syntax
    • Closure Expression Syntax는 다음과 같다
    • { ( 파라메터 ) -> 리턴타입 in
    •     내용
    • }
    • Closure Expression에서는 Parameter로 상수, 변수, inout을 사용 할 수 있다. 그러나, default 값은 사용 할 수 없으며 Variadic 타입의 경우 이름을 붙여 Parameter의 제일 마지막 부분에만 사용하는 경우만 사용이 가능하다
    • 앞서 sorted 함수에서 사용했던 backwards 함수를 Closure Expression으로 표현하면 다음과 같다.
      • var reversed = sorted(names, {
      •   (s1: String, s2: String) -> Bool in
      •   return s1 > s2
      • }
    • 이 inline closure의 파라메터와 리턴타입 선언부는 backwards 함수의 것과 동일하지만 함수와 달리 괄호 문자로 ('{') 둘러 싸여 있다는 차이가 있다.
    • inline closure는 in 이라는 키워드를 기준으로 in 이전에는 파라메터 및 리턴타입을, 이후에는 본문을 구분된다
    • 본문 내용이 그리 길지 않은 경우 다음과 같이 한 줄로 줄여서 사용 할 수도 있다
      • var reversed = sorted(names, {(s1: String, s2:String) -> Bool in return s1 > s2 })
  • Inferring Type From Context
    • sorted 함수의 경우 Closure로 넘기는 parameter의 타입으로 부터 closure의 타입을 짐작할 수 있다.
    • 앞의 예제의 경우 String Array 를 전달하게되므로 Closure 타입은 (String, String) -> Bool 이며 이를 closure expression에서는 궂이 지정할 필요는 없다
      • var reversed = sorted(names, {(s1, s2) in return s1 > s2})
  • Implicit Returns from Single-Expression Closures
    • Single-Expression Closures는 return 키워드를 생략해도 그 실행 결과가 return을 의미한다고 본다
      • var reversed = sorted(names, {(s1, s2) in s1 > s2})
    • 위의 경우는 하나의 expression ( single-expression )은 s1 > s2 이며 그 결과가 Bool 이므로 명확하게 return 값으로 처리하게 된다
  • Shorthand Argument Names
    • Swift는 inline closure에 대해 별도의 명시가 없는 경우 그 순서에 따라 $0, $1 와 같이 자동으로 shorthand argument 이름을 제공한다. 따라서, 별도의 argument를 지정하지 않는다 해도 이를 이용해서 closure를 구성 할 수 있다.
      • var reversed = sorted(names, { $0 > $1 })
      • 여기서 $0은 closure의 첫 번째 String 타입 parameter, $1는 두 번째 String 타입 parameter를 의미한다
  • Operator Functions
    • Swift에서는 앞서 예제를 가장 짧게 줄일 수 있는 방법을 제공하는데 바로 Operator Function 이다.
    • Swift는 두 개의 String 타입 Parameter와 Bool 타입의 리턴타입을 가지는 함수로 greater-than operator ( > )에 대한 구현을 정의 해 놓고 있다
    • 이는 위의 sorted 함수의 예제에 사용된 closure 타입과 정확하게 일치하므로 그냥 단순하게 greater-than operator를 closure 자리에 대치 할 수도 있다
      • var reversed = sorted(names, > )
    • 자세한 내용은 별도의 Operator Functions 항목에 자세히 설명되어 있음

Trailing Closures Expressions

closure expression을 함수의 마지막 argument로 전달하고 그 expression이 길어질 때 trailing closure라는 방식으로 작성하면 유용할 수 있다.
Training closure는 이를 지원하는 함수의 괄호 ('()') 바깥쪽 (그리고 바로 직후)에 쓰는 closure expression이다.
  • 다음과 같이 closure를 입력 받는 함수를 정의한다면
    • func test(closure:()->()) {
    •   // 본문
    • }
  • trailing closure를 사용하지 않는 호출하는 경우는 다음과 같고
    • test({
    •   // closure 본문
    • })
  • trailing closure를 사용하면 다음과 같이 호출 함수의 괄호 바깥에 놓을 수 있다
    • test() {
    •   // closure 본문
    • }
  • sorted의 예제 중 shorthanded argument를 적용해 보면 다음과 같이 줄여서 사용이 가능하다
    • var reversed = sorted(name) { $0 > $1 }

trailing closure는 single-line으로 표현하기 어려운 긴 closure를 표현할 때 가장 유용하다. Array의 map과 같은 method는 argument로 하나의 closure를 입력받는데, 해당 closure에 Array Item을 하나씩 넘겨주고, closure에서 mapping 된 새로운 정보를 리턴받는다. 이 때 기존 Array와 동일한 순서를 갖지만 새롭게 mapping된 값을 갖는 새로운 Array가 생성된다. 

  • let numstr = [1, 2, 3].map {
  •   (var num) -> String in  String(num)
  • }


    'Technical Stubs > Apple Swift' 카테고리의 다른 글

    함수 호출 문법에서 missing arguments labels가 나올 때  (0) 2014.09.18
    Swift - Closures  (0) 2014.08.12
    Swift - Function  (0) 2014.08.11
    Swift - Control Flow  (0) 2014.08.11
    Swift - Data Type #Collections  (0) 2014.08.08
    Swift - String  (0) 2014.08.08
    Trackback 0 Comment 0
    2014.08.11 17:00

    Swift - Function

    Defining and Calling Functions
      • 기본적인 함수 정의는 다음과 같다
        • func 함수이름 ( 인자 정보 ) -> 리턴타입
        • 인자 정보는 이름:타입 형태를 따른다
          • func test (param1: String) -> String
      • 정의된 함수의 호출은 다음과 같다
        • test("Hello")

      Function Parameters and Return Values

      • Multiple Input Parameters
        • 인자 정보에 comma 문자 (',')를 이용하여 여러 인자를 입력 받을 수 있다
          • func test (param1: String, param2: Int) -> String
        • 해당 함수에 대한 호출은 다음과 같다
          • test("Hello", 100)
      • Functions Without Parameters
        • 다음과 같이 인자 정보를 기입하지 않는다
          • func test () -> String
      • Functions Without Return Values
        • 다음과 같이 return 정보를 기입하지 않는다
          • func test (param1: String)
      • Functions with Multiple Return Values
        • 리턴 타입 정의에 Tuple 타입으로 정의한다
          • func test (param1: String) -> (ret1: String, ret2: String)
      • Optional Tuple Return Types
        • 리턴 값에 대한 존재 여부가 불확실한 경우 return 타입에 Question 문자 ('?')를 붙여 optional로 정의한다
          • func test (param1: String) -> String?

      Function Parameter Names
        • External Parameter Names
          • Swift 함수는 같이 Objective C에서와 같이 함수 인자 이름을 노출하여 함수 인자에 대한 가독성을 높일 수 있다
            • func test(name s1: String, withFamilyName s2: String) 
          • 외부로 인자 이름을 노출하면 호출할 때 다음과 같이 해당 이름과 함께 호출 해야 한다
            • test(name: "JeongSeok", withFamilyName: "Hong")
        • Shorthand External Parameter Names
          • 외부로 노출되는 인자 이름과 내부에서 사용하는 이름이 동일한 경우 궂이 똑같은 이름을 동일하게 작성 할 필요 없이 내부에는 sharp 문자 ('#')를 앞에 붙여서 정의한다
            • func test(#name: String)
        • Default Parameter Values
          • 함수 정의 시 default 값을 가진 인자는 호출 시 값을 정의하지 않는 경우 default로 정의된 값을 사용할 수 있다
          • 함수 인자 중간에 default 값이 있는 경우 해당 값을 지정하지 않을 수 있으나 함수에 정의된 인자의 순서는 지켜져야 한다
        • External Names for Parameters with Default Value
          • 기본값을 가지는 인자에 대해서는 자동으로 외부 이름으로 노출이 된다
        • Variadic Parameters
          • 가변 함수 인자는 특정 타입에 대해서 0 또는 그 이상을 받아드릴 수 있도록 정의할 수 있다.
          • 특정 타입 정보 이후 three period 문자 ("...")를 두어 해당 인자가 Variadic임을 표시한다
            • Double...
            • Int...
          • 다른 타입의 인자와 함께 사용 할 수도 있으나 혼란을 방지하기 위해 Variad제일 마지막에 놓여야 정상적으로 인식된다
        • Constant and Variable Parameters
          • 함수에 사용되는 인자는 기본으로 상수로 선언되므로 해당 값을 변경 시 컴파일 오류를 발생한다
          • 그러나 새로운 변수를 할당하지 않고 변수로 사용하는게 편리할 때가 있으므로 인자 값에 var 키워드를 두는 방법을 이용 할 수 있다
            • func test(var name: String)
        • In-Out Parameters
          • 변수로 활용되는 함수 인자는 실제 복사가 되므로 함수 호출에 사용된 정보와 내부에서 사용하는 정보는 같은 값을 가졌으나 다른 정보라고 볼 수 있다
          • 그러나 C나 JavaScript에서와 같이 필요에 따라서 함수 인자로 넘겨진 정보 자체를 변경해야 더 효율적인 경우가 있다
          • 이를 위해 Swift에서는 inout 키워드를 제공한다. 참고로. inout 키워드로 선언된 인자는 var나 let이 될 수 없다
            • func test(inout name: String)
          • 그리고 input을 인자로 가진 함수는 C 언어와 유사하게 ampersand 문자 ('&')를 인자값에 같이 전달한다
            • func test(&name)

        Function Types

        Swift에서는 모든 함수에도 각각의 함수 타입을 정의 할 수 있다.
        함수 타입은 함수 인자 타입과 리턴 타입으로 구성되어 있다.
        • func test(name: String, age: Int) -> String
        이럴 경우 함수 타입은 다음과 같다
        • (String, Int) -> String
        • Using Function Types
          • 함수 타입은 변수나 상수로 선언하여 사용 할 수 있다
            • var testFunc: (String, Int) -> String = test
          • 함수 호출은 일반 함수와 동일하게 사용한다
            • testFunc("Hello", 100)
        • Function Types as Parameter Types
          • 함수 타입을 다른 함수의 인자 함수 타입으로 지정 할 수도 있다
            • func testWithFunc ( testFunc : (String, Int) -> Int, name: String, num : Int)
        • Function Types as Return Types
          • 함수 타입을 다른 함수의 리턴 타입으로 지정 하여 사용 할 수 있다
            • func testAsReturnFunc ( name: String, num: Int) -> (String, Int)-> Int
        • Nested Function
          • 함수 내부에 새로운 함수하여 global 함수가 아닌 내부 함수로서 사용하는 방식을 제공한다
          • func testAsReturnFunc ( name : String, num: Int ) -> (String, Int) -> Int {
          •     func innerFuncA(name: String, age: Int) -> Int {
          •     ...
          •     }
          •     ...
          • }


        'Technical Stubs > Apple Swift' 카테고리의 다른 글

        함수 호출 문법에서 missing arguments labels가 나올 때  (0) 2014.09.18
        Swift - Closures  (0) 2014.08.12
        Swift - Function  (0) 2014.08.11
        Swift - Control Flow  (0) 2014.08.11
        Swift - Data Type #Collections  (0) 2014.08.08
        Swift - String  (0) 2014.08.08
        Trackback 0 Comment 0
        2014.08.11 15:19

        Swift - Control Flow

        For Loops
        • for-in
        • for-condition-increment

        While Loops
        • while
        • do-while

        Conditional Statements
        • if
          • else
          • if else
        • switch
          • case
            • switch에 넘겨진 값에 대한 경우 (case)를 정의한다
            • C 언어에서 같이 명시적으로 해당 case에 대한 break를 쓰지 않아도 된다
              • case A:
              •   handle it for A
              • case B:
              •   handle it for B
            • 여러 case에 해당하는 경우 comma (',')로 연결된 형태로 정의한다
              • case A, B:
              •   handle it for A or B
            • Case에 Range 타입을 입력 할 수 있음
              • case 1...3:
            • Switch 타입이 Tuple인 경우도 처리할 수 있다
              • case (A, B):
              • case (1...3, 5...10):
          • case-where
            • 기본적인 case 조건에 where라는 별도 조건을 추가 할 수 있다
              • case let (x, y) where x == y:
          • default
            • case로 정의되지 않은 부분을 처리한다
            • Swift에서는 switch 문 사용 시 case 를 꽤 철저히 하도록 강제하고 있다
            • 따라서, 명확하게 case를 작성하지 않을 때에는 default를 작성해야 한다
            • default의 경우 적어도 실행 가능한 statement를 문을 작성해야 XCode에서 오류 표시가 되지 않는다.
            • 좀 귀찮기는 하지만 default에서 별다른 동작을 하지 않는다 하더라도 break를 써 준다

        Control Transfer Statements
            • continue
            • break
            • fallthrough
              • Swift는 C언어와 달리 switch 문에서 궂이 break를 써서 case를 구분하지 않는다
              • 따라서, C언어와 같이 case 내부의 실행 조건에 따라 아래 case로 흐름을 넘기기 위해 fallthrough라는 statement가 추가되어 있다
            • return

          Labeled Statements
            • switch나 일반적인 loop 문은 같이 중첩해서 사용 할 수 있다.
            • switch나  loop 문에서 앞에 colon 문자 (':')과 함께 label을 지정하고, 이후 break나 continue statement 문 뒤에 앞서 지정한 label 이름을 지정하면 해당 label로 지정된 statement에 대해 break 또는 continue 동작을 수행한다.


            'Technical Stubs > Apple Swift' 카테고리의 다른 글

            Swift - Closures  (0) 2014.08.12
            Swift - Function  (0) 2014.08.11
            Swift - Control Flow  (0) 2014.08.11
            Swift - Data Type #Collections  (0) 2014.08.08
            Swift - String  (0) 2014.08.08
            Swift - Operators  (0) 2014.08.08
            Trackback 0 Comment 0
            2014.08.08 19:01

            Swift - Data Type #Collections

            Array
            • Array에 대한 타입은 Array<SomeType> 형태로 선언한다
            • 그러나 간략하게 [SomeType] 형태로 쓸 수 있다
            • 문자열에 대한 Array
              • var list: [String] = ["A", "B", "C"]
            • 당연한 이야기지만 let을 이용하는 경우 상수가 되며 편집 불가 (immutable) 상태가 된다
            • 같은 Type의 Array는 서로 병합이 가능하다
              • list += ["d", "e"] + ["f"] 

            Array 초기화
            • Array를 생성 시 Type 정보화 함께 초기화를 할 수 있다
              • var someInts = [Int]()
            • 이렇게 선언할 경우 item count가 0인 정수형 Array가 생성된다
            • 동일한 형태로 다음과 같이 선언 할 수도 있다
              • var someInts:[Int] = []
            • Array 타입은 특정 크기와 값으로 초기화 하는 기능도 제공한다
              • var threes = [Int](count:3, repeatedValue: 1)
            • 이럴 경우 1로 3개의 item을 가진 정수형 Array가 생성된다

            Dictionary
            • Dictionary에 대한 타입은 Dictionary<KeyType, ValueType> 형태로 선언한다
            • 그러나 간략하게는 [KeyType: ValueType]으로 쓸 수 있다
              • var dict:[String: String] = ["ICN":"Incheon Airport", "LAX":"Los Angeles"]
              • var airports = ["ICN":"Incheon Airport", "LAX":"Los Angeles"]

            Dictionary를 이용한 반복문
            • Dictionary는 Array와 같이 for-in 문과 같이 사용 할 수 있고 각 Item에 대해 (key, value) 형태를 쓸 수 있다.
              • for (code, name) in airports {
              •     println("\(code):\(name)")
              • }
            • key 또는 value만 둘 중 하나만 사용한다면 Underscore ('_') 를 정의해서 사용 할 수도 있으며
              • for (code, _) in airports {
              • }
            • keys, values와 같이 별도 property를 이용할 수도 있다.
              • for code in airports.keys 
              • for name in airports.values

            Dictionary 초기화
            • Dictionary를 생성 시 타입 정보와 함께 생성 할 수 있다
              • var namesOfInts = [Int: String]()
            • 생성된 dictionary를 모두 없애는 경우 다음과 같이 표현할 수 있다
              •  namesOfInts = [:]
            • Dictionary의 KeyType으로 사용되려면 해당 타입은 Hashable 프로토콜을 따라야 한다
            • 참고로, Swift에서 제공하는 모든 기본 타입 (String, Int, Double 등)은 모두 Hashable 이다.
            • Hashable은 hasValue property를 가지고 있으니 custom type을 생성할 경우 이를 주의해야 한다


            'Technical Stubs > Apple Swift' 카테고리의 다른 글

            Swift - Function  (0) 2014.08.11
            Swift - Control Flow  (0) 2014.08.11
            Swift - Data Type #Collections  (0) 2014.08.08
            Swift - String  (0) 2014.08.08
            Swift - Operators  (0) 2014.08.08
            Swift - Data Type #Tuple  (0) 2014.08.08
            Trackback 0 Comment 0
            2014.08.08 18:03

            Swift - String

            Objective-C NSString과 호환
            • Swift String은 Objective-C NSString과 seamless 하게 동작하도록 연결되어 있음
            • 따라서, NSString에서 제공하던 API가 Swift String에서도 동일하게 제공됨

            문자열 초기화
            • literal 로 초기화
              • var emptyString = ""
            • Type initializer로 초기화
              • var emptyString = String()


            문자열 편집
            • 변수로 선언된 경우 따옴표로 묶여있는 문자열 또는 다른 문자열 변수/상수를 할당

            Value 타입의 문자열
            • 기본적으로 String 타입은 Value 타입으로 함수나 메소드에 전달되나 새로운 변수, 상수에 할당 될 때 그 값이 복사가 된다
            • 실제 Swift 내부적으로는 실행 시 필요한 경우에만 복사를 한다고 한다 (성능 관련)

            Character 타입과 관계
            • String은 Character의 조합으로 구성되어 있다
            • String과 Character를 붙일 경우 이를 String에 다시 할당 할 수 있다

            let ch:Character = "A"

            let str:String = "Hello"

            let ch_str = str + ch     // "HelloA"


            String Interpolation
            • 문자열 중간에 Escape를 두어 상수나 변수를 문자열과 조합 할 수 있는 기능

            let ch:Character = "A"

            let str:String = "Hello \(A)" // "Hello A"


            Unicode
            • 21 bits Unicode scalar를 사용
            • LATIN SMALL LETTER A는 U+0061 (a)와 같다
            • 특수 문자로 \0 (null) , \\ (backslash) , \t (horizontal tab), \n (line feed), \r (carriage return), \" (double quote), \' (single quote)이 있다
            • 숫자로 표현하는 경우 \u{number} 로 표현하며 1부터 8자리까지의 16진수 값이다

            let dollarSign = "\u{24}" 


            Extended Grapheme Clusters
            • extended grapheme cluster는 하나 또는 연속되 Unicode Scalar의 묶음으로 조합되었을 때 사람이 읽을 수 있는 문자가 되는 구성을 말한다
            • 예를 들어 "한" 이라는 글자는 U+D55C 이며, 이 글자는 ㅎ(U+1112, 초성), ㅏ(U+1161, 중성), ㄴ(U+11AB, 종성)으로 구성되어 있다
            • Swift String에서 다음과 같이 문자열을 구성하면 "\u{1112}\u{1161}\u{11AB}"가 되며 이 문자열이 화면에 표시되는 경우 "한" 으로 표시된다.
            • 같은 글자로 표시되고 하나의 Charactor 로 생성되며 비교시 동일하게 인식하다고 했지만 실제 실행해 보면 그런것으로 보이지는 않는다. 이부분은 좀 더 확인이 필요할 것 같다

            Unicode 표현
            • Swift 문자열는 자기가 가지고 있는 Character를 표현하는 property를 제공한다
            • utf8 : UTF-8 코드
            • utf16 :UTF-16 코드
            • unicodeScalars : 21bit Unicode Scalar로 UTF-32와 동일


            'Technical Stubs > Apple Swift' 카테고리의 다른 글

            Swift - Control Flow  (0) 2014.08.11
            Swift - Data Type #Collections  (0) 2014.08.08
            Swift - String  (0) 2014.08.08
            Swift - Operators  (0) 2014.08.08
            Swift - Data Type #Tuple  (0) 2014.08.08
            Swift - Data Type #Optionals  (0) 2014.08.08
            Trackback 0 Comment 0
            2014.08.08 17:28

            Swift - Operators

            비교 Operator
            • Equal : ( a == b)
            • Not Equal : ( a != b )
            • Greater Than : ( a > b )
            • Less Than : ( a < b )
            • Greater than or equal to : ( a >= b )
            • Less than or equal to : ( a <= b )

            Ternary Condition Operator
            • 세 부분을 되어 있는 조건문
            • question ? answer1 : answer2

            Nil Coalescing Operator
            • ( a ?? b) 의 형태로 사용되며 a는 optional 값으로 a의 값이 있는 경우 a의 unwrapped optional으로 전달하며 없는 경우는 default 값으로써 b를 전달한다
            • 따라서 ( a ?? b ) 구문은 다음과 동일한 동작을 수행한다
              • a != nil ? a! : b
            • 만약 a 가 nil 이 아닌 경우 b는 수행되지 않는 short-circuit evaluation으로 수행된다

            Closed Range Operator
            • ( a ... b) 의 형태로 사용되며 a 부터 b까지 실행을 말한다
            • a는 b보다 크면 안된다.
            • for-in 과 같은 반복문에서 주로 사용된다

            for index in 1...5 {

              println ("\(index) x 5 is \(index * 5)") // 5회 호출

            }


            Half-Open Range Operator
            • ( a ..< b) 의 형태로 사용되며 a 부터 b까지 실행을 하지만 b는 포함하지 않는다

            for index in 1..<5 {

              println ("\(index) x 5 is \(index * 5)") // 4회 호출

            }


            논리 Operator
            • NOT : ( !a )
            • AND : ( a && b )
            • OR : ( a || b )

            Cast Operator
            • Type check : is
            • Type cast : as


            'Technical Stubs > Apple Swift' 카테고리의 다른 글

            Swift - Data Type #Collections  (0) 2014.08.08
            Swift - String  (0) 2014.08.08
            Swift - Operators  (0) 2014.08.08
            Swift - Data Type #Tuple  (0) 2014.08.08
            Swift - Data Type #Optionals  (0) 2014.08.08
            Swift - Data Type #General  (0) 2014.08.08
            Trackback 0 Comment 0
            2014.08.08 17:02

            Swift - Data Type #Tuple

            Tuples
            • 여러개의 값을 하나로 묶은 그룹을 말함
            • Tuple에 들어가는 값은 어떤 타입도 가능하며, 각각 같은 타입일 필요도 없음
            • 괄호로 둘러싸이며 콤마로 구분된다
            • 예를 들어 let A = (404, "Not Found")로 선언하면 이는 (Int, String) 의 Tuple 타입으로 선언된 것이다
            • A 를 전달 받을 B를 변수로 선언한다면 다음과 같이 선언한다
              • var B:(Int, String) = A
            • 튜플를 다시 분리하려면 다음과 같이 변수이름으로 나눠서 선언해야 한다
              • let (C, D) = A
            • 사용하지 않는 항목이라면 Underscore로 표현하여 무시한다
              • let (C, _) = A
            • 아니면 그룹으로 묶어진 순서대로 dot 문자와 인덱스 숫자로 선언할 수 있다
              • let C = A.0, D= A.1
            • 또는, Tuple 생성 시 각 항목의 이름을 다음과 같이 할당해서 사용 할 수도 있다.
              • let A = (code: 404, message: "Not Found")
              • let C = A.code, D = A.message


            'Technical Stubs > Apple Swift' 카테고리의 다른 글

            Swift - String  (0) 2014.08.08
            Swift - Operators  (0) 2014.08.08
            Swift - Data Type #Tuple  (0) 2014.08.08
            Swift - Data Type #Optionals  (0) 2014.08.08
            Swift - Data Type #General  (0) 2014.08.08
            Swift - General  (0) 2014.08.08
            Trackback 0 Comment 0
            2014.08.08 16:58

            Swift - Data Type #Optionals

            Optional 타입

            • 변수나 상수에 값이 있는지도 모르는 경우에 사용한다
            • 예를 들어 X에 값이 있는 경우에만 Y와 같은지 비교하고자 할 때 사용한다
            • Optional로 선언하려면 데이터 타입 뒤에 물음표 (?)를 붙여서 사용한다
            • 예를 들어 정수형의 경우 다음과 같이 선언한다
              • var A:Int?
            • A에 정수값 100을 할당하거나 nil을 할당하여 A가 아무런 값이 없도록 할 수 있다.
              • A = 100 또는 A = nil
            • 참고로 Swift의 nil은 Objective-C의 nil과 다르며 단지 값의 존재 여부를 확인하는 용도로만 사용된다
            • 만약 해당 값이 분명히 존재한다고 확신하는 경우 느낌표(!) 문자를 뒤에 붙여 사용할 수 있다

            if A != nil {

                println (" A has a value of \(A!).")


            Optional Binding

            • if 나 while 문에서 Optional 타입 값이 있는 경우 해당 값을 임시로 상수나 변수에 할당하여 사용하는 것을 말한다

            Implicitly Unwrapped Optional

            • Optional 타입이라 할지라도 명확하게 항상 값을 갖는 경우라면 이를 사용할 때 이름뒤에 느낌표(!)를 붙여서 사용할 수 있지만, 사용하는 곳이 많아지면 느낌표를 붙여서 사용하기도 매우 귀찮은 일이 될 것이므로, 아예 생성 타입에 느낌표(!)를 붙이여 Optional이 아닌 상태로 생성하도록 한다.
              • var A:Int? = 100
              • var B:Int! = A
            • 참고로 Implicitly Unwrapped Optional로 선언되었다 하더라도 값이 없는 경우에는 nil 값을 가질 수 있다


            'Technical Stubs > Apple Swift' 카테고리의 다른 글

            Swift - String  (0) 2014.08.08
            Swift - Operators  (0) 2014.08.08
            Swift - Data Type #Tuple  (0) 2014.08.08
            Swift - Data Type #Optionals  (0) 2014.08.08
            Swift - Data Type #General  (0) 2014.08.08
            Swift - General  (0) 2014.08.08
            Trackback 0 Comment 0
            2014.08.08 14:10

            Swift - Data Type #General

            데이터 타입
            • Int/UInt : 정수형
              • size에 대한 명시가 없는 경우 Platform Native Word Size에 대응)
              • Unsigned : UInt8, UInt16, UInt32, UInt64
              • Signed : Int8, Int16, Int32, Int64
            • Double : 64 비트 부동 소수점
            • Float : 32 비트 부동 소수점
            • Bool : 참/거짓
            • String : 문자열 데이터
            • Array : 배열
            • Dictionary : Key-Value 형태의 집합

            값 할당에 대한 타입

            • 기본적인 데이터의 타입에 따라 자동으로 타입이 인식된다
              • 정수형 : Int
              • 실수형 : Double
              • 정수형+실수형 : Double
            • 숫자 값 표현
              • 10진수
              • 2진수 : 0b
              • 8진수 : 0o
              • 16진수 : 0x
            • 지수
              • 10진수 : e를 사용 ( 10^exp 값을 곱한다 )
              • 16진수 : p를 사용 ( 2^exp 값을 곱한다 )
            • Underscore ( _ )를 이용하여 숫자 자릿수 구분 문자로 사용가능

            숫자 타입 변환
            • Swift에서는 숫자의 경우 타입이 서로 같아야 기본적인 사칙 연산이 가능하다
            • 데이터 타입이 서로 다를 경우 특정 타입을 기준으로 변환해야 한다
            • 한번 선언된 데이터 타입은 변하지 않으므로 기준으로 마련된 타입으로 새롭게 생성 해야 한다

            정의된 타입으로 상수/변수를 생성할 때 초기화 하는 방법으로 다음과 같은 표현을 사용한다.


             SomeType ( Initial Value )


            C 언어에서의 Type Casting과는 좀 다르며 Casting이 아니라 Copy로써 데이터를 생성한다

            근데, 만약 초기 값이 Target Type 에서 처리할 수 없는 숫자인 경우 오류가 발생하니 주의 해야 한다


            실수에서 정수로 변환
            • 정수 영역을 제외한 소수점 영역은 버림으로 처리한다

            타입 Alias
            • typealias 를 이용하여 기존 정의된 타입을 새로운 이름의 타입으로 정의할 수 있다


            'Technical Stubs > Apple Swift' 카테고리의 다른 글

            Swift - String  (0) 2014.08.08
            Swift - Operators  (0) 2014.08.08
            Swift - Data Type #Tuple  (0) 2014.08.08
            Swift - Data Type #Optionals  (0) 2014.08.08
            Swift - Data Type #General  (0) 2014.08.08
            Swift - General  (0) 2014.08.08
            Trackback 0 Comment 0