var number : Int?
옵셔널 선언을 하려면 자료 타입 뒤에 ?을 붙이면 된다.
옵셔널의 선언에서 보면 값이 있을수도 있고 없을수도 있다 라는 것은 예를 들자면 정수타입 자료형의 0이 있다고 값이 없는것이 아니다.
값이 없다고 표현하는것은 nil이다 int로 선언한 자료형에 사용하면 오류가 나기 때문에 옵셔널을 사용하고 자료형의 ?을 붙이면된다
var number : Int
number = nil //컴파일 오류
var number : Int?
number = nil // nil
var name : String?
name = "hello"
var hello : String
hello = name // 컴파일 오류
옵셔널로 선언한 name의 값은 String인 hello에 값을 대입할 수 없다.
그 이유는 String으로 선언한 변수는 항상 값이 있어야 하지만 옵셔널로 선언된 변수는 실행하기 전까지 값이 있는지 없는지 모르기 때문에 오류가 발생한다.
var number : Int?
number = 1
print(number) // Optional(1) 출력
print(number!) // 1 출력
만약에 number변수에 nil값이 있다면 오류가 발생한다 그렇기 때문에 !는 확실히 값이 있을때만 사용하는게 좋다.
옵셔널 바인딩이란 if문에서 변수의 값이 존재한다면 다른 변수에 값을 대입 시켜주고 if문을 실행하고 nil이라면 그냥 넘어간다.
var number: Int?
number = 1
if let optionalNumber = number {
print(optionalNumber) // 1이 출력된다
}
옵셔널 바인딩은 두개의 변수도 가능하고 조건식을 넣어서도 가능하다 조건식은 옵셔널 바인딩을 실행 후에 조건을 검사한다
var number: Int?
number = 1
var name: String?
name = "hello"
if let optionalNumber = number , optionalName = name{
}
var number : Int?
number = 1
if let optionalNumber = number , optionalNumber > 0 {
}
비교 연산자를 사용하면 자동적으로 컴파일러가 해제 시켜준다.
var optionalNumber = Optional(1) //1 출력
var optionalNumber1 = 1 // 1출력
자료 타입 뒤에 ? 대신 ! 선언하여 옵셔널을 해제 한다 하지만 옵셔널이 올수도 있는 값에 쓴다면 오류가 나오기 때문에 확실한 변수에만 선언한다.
var name = "1"
var number : Int! = Int(name) // 1
내부 프로퍼티나 메소드에 옵셔널 있다면 if문을 쓰면 복잡하기 때문에 옵셔널 체이닝을 쓴다
struct Name{
var name:String?
}
struct Number {
var nName : Name?
}
var numbername: Number? = Number(nName: Name(name: "hello"))
numbername?.nName?.name = "hello" // 이런식으로 접근이 가능하다
print(numbername?.nName?.name) // Optional("Hello")