var optionalName: String? = getStringFromSomewhere()
var names :[String] = []
if optionalName { // 값이 존재하는지 테스트를 해줘야 함.
names += optionalName // 에러 발생. !를 적어 unwrap해야 함.
} else {
//...
}
이처럼 String과 String? 의 차이가 문제시되는 코드가 있다. 즉, optional type을 다룰때는 항상 값 존재여부 테스트 및 unwrapping문제가 따라다님. 이 두문제를 한꺼번에 해결하는 문법이 아래와 같다.
var names :[String] = []
if let name = getStringFromSomewhere() {
names += name
} else {
//...
}
name이라는 non-optional변수가 생겨났고 optionalName이라는 옵셔널 변수가 사라졌다. 즉, if let 문법을 사용하면 옵셔널 변수를 줄일수 있게 되는 것이다. name이 가변적일 경우 let 대신 var를 써도 상관없다.
if let a = b.c {
a.d()
}
// 위는 아래와 같이 바꿔 쓸 수 있다.
b.c?.d()
if let data = widget.dataStream {
if data.isValid {
if let source = sourceIP() {
if let dest = destIP() {
// do something
}
}
}
}
// 위와 아래는 동일하다.
if let data = widget.dataStream, data.isValid, let source = sourceIP(), let dest = destIP() {
// do something
}
if (age > 17 && profile.public) {
if let first = user.first {
if let last = user.last {
return "\(first) \(last)"
}
}
}
// 위의 nesting구조를 아래처럼 컴마로 연결해서 쓸수있다.
if age > 17 && profile.public, let first = user.first, last = user.last {
return "\(first) \(last)"
}