Swift 둘러보기(2)

EN·2022년 9월 25일

Optional

  • 있을 수도 있고, 없을 수도 있고!
  • String? <- 이런식으로 물음표를 붙여서 표현한다.
  • 구조체, 클래스, 열거형의 옵셔널은 변수가 값을 저장하지 않을 수도 있다는 것을 의미한다!

nil, Nil, Null, nsNull의 차이

  • nil: objective-c의 object의 null값
  • Nil: objective-c의 class의 null값
  • Null: C pointer의 null값
  • NsNull: NSObject를 상속받는 개체로, collection item을 null로 설정할 때 사용한다.

옵셔널 바인딩

  • if let name = optionalName { //if-let문법
         let greeting = "Hello, \(name)"
         print("\(greeting)")
     }else{
         print("No Name")
     }
  • 위의 문법은 if-let을 이용한 옵셔널 바인딩이다.
  • 누락될 수 있는 값에 대해 사용할 수 있다.
  • 옵셔널로 선언된 값에 실제 값을 할당하면 바로 사용할 수 없다!!!!!! 그 값이 nil일 가능성을 해결해야 변수의 값을 읽을 수 있다.
  • 이를 옵셔널의 언랩핑이라고 한다.
  • 콤마는 and의 개념(&&)이다!
    • 이 둘의 차이는, comma(,)는 condition을 이어 붙일 때 쓰이는 것이다. 하지만 &&는 두 개의 boolean expression을 받는 파라미터 이다.
    • condition의 종류
      • expression
      • availability-expression
      • case-condition
      • optional-binding condition
    • 여기서 expression의 정의를 간단하게 생각해보면, 연산자를 하나라도 쓴 스위프트 코드 단위 라고 할 수 있다.
    • 그러면 왜 옵셔널 바인딩으로 여러개의 바인딩 사이에 &&는 안되고 ,는 될까?
      • 논리연산자 &&는 두 개의 bool expression을 인자로 받는다,
      • 하지만 let a = A 와 let b = B는 bool expression이 아니다.
      • 쉽게 말해, "asd" && "asb"가 안되는 것이다.
      • 위 표현은 c++에서는 이상 없이 작동하지만, swift에서는 금지하고 있다.

강제 언래핑

  • 느낌표를 붙여서 강제로 언래핑하는 건데, 이는 안사용하는게 좋다.

??를 이용한 값 대체

import Foundation
let nickname: String? = nil
let fullName: String = "John Appleseed"

let informalGreeting = "Hi \(nickname ?? fullName)"
print("\(informalGreeting)")
  • C++의 삼항 연산과 비슷하다.
  • nickname이 nil일 경우, fullName으로 대체한다는 의미!

함수와 클로져

  • 함수를 사용하려면 func를 사용해야 한다.
func greet(person: String, day: String) -> String {
  let result: String = "Hello \(person), today is \(day)."
  return result
}

let greetMessage: String = greet(person: "Eunno", day: "9/20/2022")
print("\(greetMessage)")
  • Kotlin과의 차이를 짚고 넘어가면
    • swift에서는 func, kotlin에서는 fun을 사용
    • return 표시는 코틀린에서 ':'를 사용하고, swift에서는 '->'를 사용한다.
    • 그리고 함수를 호출할 때, 명시적으로 어떤 내용에 대한것인지 변수명을 적어주어야 한다. 이것을 인수라벨이라고 한다.
      func greet(_ person: String, day: String) -> String {
          let result: String = "Hello \(person), today is \(day)."
          return result
      }
      let greetMessage: String = greet("Eunno", day: "09/20/2022")
      print("\(greetMessage)")
    • 이걸 안쓰려면 함수 선언에다가 변수 '_'(언더바)를 사용하면 된다. 하지만 권장하지는 않는다.
    • 튜플을 사용하여 복합 리턴 값을 만들 수 있다.
    • "함수 안에 함수"를 선언할 수 있다.
      • 그 대신, 안에 있는 함수도 지역함수라서, 외부함수 밖에서 사용 할 수 없다.
    • 함수는 1급 타입(first-class type)임! 함수가 타입이다 라는 말로 생각하기!!
      • 이게 왜 중요하냐면, 함수가 1급 타입으로서, 이것은 함수가 다른 함수를 값으로 변환할 수 있다는 말이다!
      • 다른 함수를 인수로 가질 수도 있다!!

클래스와 구조체의 차이

  • 클래스는 상속이 가능, 구조체는 불가하다

열거형은 메서드를 가질 수 있다.

  • 안의 요소들은 case라고 한다.

    enum City: Int{
    case San_Francisco=1
    case Paris, Seoul, New_York, London
    
    func help() -> String{
      switch self{
        case .San_Francisco, .New_York, .London:
          return "Hi(S)"
        case .Paris:
          return "Bonjour"
        case .Seoul:
          return "안녕하세요"
        //Default는 여기서 필요가 없다.
      }
    }
    }
    let human: City = City.Paris
    print("\(human.help())")
profile
iOS/JUJITSU

0개의 댓글