함수를 사용하면 특정 기능을 수행하는 재사용 가능한 코드 조각들을 정의 할 수 있습니다.
스위프트에서 값이 있고 없고를 표현해야 할 때, 사용자가 직접 값에 의미를 부여해서 판단할 수 있지만 겹치는 경우도 생길 것입니다.
ex) 정수의 경우 0
, 문자열의 경우 ""
, " "
등등 → (확실하지 않습니다.)
값이 없다는 것을 확실히 표현하기 위해 스위프트에서는 옵셔널이라는 방법을 제공합니다.
nil
: 값이 없음 , 옵셔널타입을 만들려면 타입 뒤에 ?
추가합니다.nil
인 경우에 안전하게 처리해야 합니다.if let
, guard let
!
을 사용할 수 있습니다.IUO 암묵적언래핑옵셔널타입
보통 iOS의 UIKit 또는 macOS의 AppKit에서 사용자 인터페이스 요소로 작업 할 때 사용됩니다.
→ 미리 선언해야하지만 생성될 때까지는 사용할 수 없습니다. 애플은 불필요한 작업을 피하기 위해 마지막 순간에 사용자 인터페이스 요소를 만드는 것을 좋아합니다.
일반 변수는 선언당시 값을 저장해야합니다. (빈 문자열이라도 저장해야합니다., nil은 저장할 수 없다)
옵셔널변수는 값을 포함하지 않아도 됩니다.(사용하기 전에는 옵셔널을 해제해야 합니다.)
암묵적언래핑옵셔널타입은 값을 포함하지 않아도 됩니다.(사용하기전에 옵셔널을 해제하지 않아도 됩니다.) 하지만 주의해야 합니다. 옵셔널을 풀지 않고 값에 직접 접근할 수 있지만 값이 없는 경우 접근하면 에러가 발생할 것입니다.
@IBOutlet weak var changeView: UIView!
@IBOutlet weak var rLabel: UILabel!
@IBOutlet weak var gLabel: UILabel!
@IBOutlet weak var bLabel: UILabel!
많은 옵셔널을 해제해야하는 경우에 매번 해제 및 확인하는 작업은 번거로울 수 있습니다.
옵셔널체이닝을 사용하여 옵셔널에 값이 있는 경우에만 코드를 실행할 수 있습니다.
let album = albumReleased(year: 2006)?.someOptionalValue?.someOtherOptionalValue?.whatever
nil
이라면 nil
을 반환합니다. (왼쪽에서 오른쪽으로 확인합니다.)nil병합 연산자를 사용하면 기본값을 더 쉽게 지정할 수 있습니다. ??
let album = albumReleased(year: 2006) ?? "unknown"
스위프트는 직접만든 종류의 값들을 그룹화할 수 있는 방법을 제공합니다.
none
, some
으로 이루어진 열거형 (none : 값 없는 경우, some: 값을 래핑하는 경우)enum WeatherType {
case sun
case cloud
case rain
case wind(speed: Int)
case snow
}
func getHaterStatus(weather: WeatherType) -> String? {
switch weather {
case .sun:
return nil
case .wind(let speed) where speed < 10:
return "meh"
case .cloud, .wind:
return "dislike"
case .rain, .snow:
return "hate"
}
}
getHaterStatus(weather: WeatherType.cloud) // dislike
getHaterStatus(weather: WeatherType.wind(speed: 6)) // meh
getHaterStatus(weather: WeatherType.wind(speed: 16)) // dislike
구조체를 사용하면 여러 타입을 가진 데이터들을 하나로 그룹화할 수 있습니다.
copy on write
기술을 사용합니다. (실제로 데이터를 변경하는 경우에 복사합니다.)클래스를 사용하면 여러 타입을 가진 데이터들을 하나로 그룹화할 수 있습니다.
Objective-C 코드
애플 운영체제의 일부가 스위프트 클래스의 메서드를 호출하도록하려면 @objc
키워드를 표시해야합니다.
@objc
는 Objective-C
의 줄임말이며 이전 Objective-C
코드에서 실행할 수있는 메서드를 효과적으로 표시합니다.
@objc
키워드를 사용하지 않으려면 @objcMembers
클래스 앞에 배치 하여 자동으로 모든 메서드를 Objective-C
에서 사용할 수 있도록 할 수 있습니다.