๐ก ์ต์ ๋
๋จ์ด ๋ป ๊ทธ๋๋ '์ ํ์ ์ธ', ์ฆ ๊ฐ์ด '์์ ์๋, ์์ ์๋ ์์'์ ๋ํ๋ด๋ ํํ
'๋ณ์๋ ์์ ๋ฑ์ ๊ผญ ๊ฐ์ด ์๋ค๋ ๊ฒ์ ๋ณด์ฅํ ์ ์๋ค.' ์ฆ, ๋ณ์ ๋๋ ์์์ ๊ฐ์ด nil์ผ ์๋ ์๋ค๋ ๊ฒ์ ์๋ฏธ
์ต์ ๋ ๋ณ์์ ์ ์ธ ๋ฐ nil ํ ๋น
var myName: String? = "yejin"
print(myName) // yejin
//์ต์
๋ ํ์
์ ๊ฐ์ print ํจ์๋ฅผ ํตํด ์ถ๋ ฅํ๋ฉด
//Optional("yejin")์ด๋ผ๊ณ ์ถ๋ ฅ๋๋ ๊ฒ์ด ์ ์
//๋ค๋ง, ์ฐจํ์ ์ฃผ์ํํ์ ํธ์๋ฅผ ์ํด์
//Optional()์ ์๋ตํ๊ณ ๊ฐ๋ง ํ๊ธฐํ๋๋ก ํ๊ฒ ๋ค.
//๋, ์ต์
๋ ํ์
์ ๊ฐ์ print ํจ์์ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํ๋ฉด
//์ปดํ์ผ๋ฌ ๊ฒฝ๊ณ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
//์ ์์ด๋ฏ๋ก ๋๋ผ์ง ์์๋ ๋๋ค.
myName = nil
print(myName) // nil
์ต์ ๋์ ์ด๊ฑฐํ์ผ๋ก ๊ตฌํ๋์ด ์๋ค.
์ต์ ๋ ์ด๊ฑฐํ์ ์ ์
public enum Optional<Wrapped> : ExpressibleByNilLiteral {
case none
case some(Wrapped)
public init(_ some: Wrapped)
/// ์ค๋ต...
}
โ๏ธExpressibleByNilLiteral ํ๋กํ ์ฝ์ ๋ฐ๋ฆ
โ๏ธ์ต์ ๋์ด ๊ฐ์ ๊ฐ๋ ์ผ์ด์ค์ ๊ทธ๋ ์ง ๋ชปํ ์ผ์ด์ค ๋๊ฐ์ง๋ก ์ ์๋์ด ์๋ค.
โ๏ธ์ฆ, nil์ผ ๋๋ none ์ผ์ด์ค๊ฐ ๋ ๊ฒ์ด๊ณ , ๊ฐ์ด ์๋ ๊ฒฝ์ฐ๋ some ์ผ์ด์ค๊ฐ ๋๋๋ฐ, ์ฐ๊ด ๊ฐ์ผ๋ก Wrapped์ ๊ฐ์ด ํ ๋น ๋๋ค.
โ๏ธ์ฆ, ๊ฐ์ด ์ต์ ๋์ด๋ผ๋ ์ด๊ฑฐํ์ ๋ฐฉํจ๋ง์ ๋ณดํธ๋์ด ๋ํ๋์ด ์๋ ๋ชจ์ต
์ต์ ๋ ์์ฒด๊ฐ ์ด๊ฑฐํ์ด๊ธฐ ๋๋ฌธ์ ์ต์ ๋ ๋ณ์๋ switch ๊ตฌ๋ฌธ์ ํตํด ๊ฐ์ด ์๊ณ ์์์ ํ์ธํ ์ ์๋ค. ( +where ๋ก ์ฌ๋ฌ ์ผ์ด์ค ์กฐ๊ฑด ์ถ๊ฐ! )
let numbers: [Int?] = [2, nil, -4, nil, 100]
for number in numbers {
switch number{
case .some(let value) where value < 0:
print("Negative value! \(value)")
case .some(let value) where value > 10:
print("Large value! \(value)")
case .some(let value):
print("Value \(value)")
case .none:
print("nil")
}
}
// Value 2
// nil
// Negative value! -4
// nil
// Large value! 100
์ต์ ๋ ์ถ์ถ
1๏ธโฃ ๊ฐ์ ์ถ์ถ : ๊ฐ์ฅ ๊ฐ๋จํ์ง๋ง ์ํ, ๋ฐํ์ ์ค๋ฅ ๊ฐ๋ฅ์ฑ ๋งค์ฐ ๋์!
var myName: String? = "yejin"
// ์ต์
๋์ด ์๋ ๋ณ์์๋ ์ต์
๋ ๊ฐ์ด ๋ค์ด๊ฐ ์ ์๋ค. ์ถ์ถํด์ ํ ๋นํด์ฃผ์ด์ผ ํ๋ค.
var yejin: String = myName!
myName = nil
yejin = myName! // ๋ฐํ์ ์ค๋ฅ
// if ๊ตฌ๋ฌธ ๋ฑ ์กฐ๊ฑด๋ฌผ์ ์ด์ฉํด์ ์กฐ๊ธ ๋ ์์ ํ๊ฒ ์ฒ๋ฆฌํด์ค ์ ์๋ค.
if myName != nil {
print("My name is \(myName!)")
}
else{
print("myName === nil")
}
2๏ธโฃ ์ต์ ๋ ๋ฐ์ธ๋ฉ์ ์ฌ์ฉํ ์ต์ ๋ ๊ฐ์ ์ถ์ถ (๊ฐ์ฅ ์งํฅํ๋ ๋ฐฉ๋ฒ)
๐ก์ต์ ๋ ๋ฐ์ธ๋ฉ? ์ต์ ๋์ ๊ฐ์ด ์๋์ง ํ์ธํ ๋ ์ฌ์ฉ
๊ฐ์ด ์๋ค๋ฉด ์ต์ ๋์์ ์ถ์ถํ ๊ฐ์ ์ผ์ ๋ธ๋ก ์์์ ์ฌ์ฉํ ์ ์๋ ์์๋ ๋ณ์๋ก ํ ๋นํด์ ์ต์ ๋์ด ์๋ ํํ๋ก ์ฌ์ฉํ๊ฒ๋ ํ๋ค.
์ต์ ๋์ if ๋๋ while ๊ตฌ๋ฌธ ๋ฑ๊ณผ ๊ฒฐํฉํ์ฌ ์ฌ์ฉํ ์ ์๋ค.
var myName: String? = "yejin"
// ์ต์
๋ ๋ฐ์ธ๋ฉ์ ํตํ ์์ ์์ ํ ๋น
if let name = myName {
print("My name is \(name)")
} else {
print("MyName == nil")
}
// My name is yejin
// ์ต์
๋ ๋ฐ์ธ๋ฉ์ ํตํ ์์ ๋ณ์ ํ ๋น
if var name = myName {
name = "hejin" // ๋ณ์์ด๋ฏ๋ก ๋ด๋ถ์์ ๊ฐ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅ
print("My name is \(name)")
} else {
print("MyName == nil")
}
// My name is hejin
์ต์ ๋ ๋ฐ์ธ๋ฉ์ ์ฌ์ฉํ ์ฌ๋ฌ ๊ฐ์ ์ต์ ๋ ๊ฐ์ ์ถ์ถ
๐ซ ๋ฐ์ธ๋ฉํ๋ ค๋ ์ต์ ์ค ํ๋๋ผ๋ ๊ฐ์ด ์๋ค๋ฉด ํด๋น ๋ธ๋ก ๋ด๋ถ์ ๋ช ๋ น๋ฌธ์ ์คํ๋์ง ์๋๋ค.
var myName: String? = "yejin"
var yourName: String? = nil
// friend์ ๋ฐ์ธ๋ฉ์ด ๋์ง ์์ผ๋ฏ๋ก ์คํ๋์ง ์๋๋ค.
if let name = myName, let yourname = yourName {
print("We are friend! \(name) & \(yourname)")
}
yourName = "hyejin"
if let name = myName, let yourname = yourName {
print("We are friend! \(name) & \(yourname)")
}
// We are friend! yejin & hyejin
3๏ธโฃ ์์์ ์ถ์ถ ์ต์ ๋
- ๋๋๋ก nil์ ํ ๋นํ๊ณ ์ถ์ง๋ง, ์ต์ ๋ ๋ฐ์ธ๋ฉ์ผ๋ก ๋งค๋ฒ ๊ฐ์ ์ถ์ถํ๊ธฐ ๊ท์ฐฎ๊ฑฐ๋ ๋ก์ง์ ๋ฐํ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์ ๊ฒ ๊ฐ๋ค๋ ํ์ ์ด ๋ค ๋ nil์ ํ ๋นํด์ค ์ ์๋ ์ต์ ๋์ด ์๋ ๋ณ์๋ ์์๊ฐ ํ์ํ ๋ ์์์ ์ถ์ถ ์ต์ ๋์ ์ฌ์ฉํ๋ค!
- ์์์ ์ถ์ถ ์ต์ ๋๋ก ์ง์ ๋ ํ์ ์ ์ผ๋ฐ ๊ฐ์ผ๋ก ์ฌ์ฉ๋ ์ ์์ผ๋, ์ฌ์ ํ ์ต์ ๋์ด๊ธฐ ๋๋ฌธ์ nil๋ ํ ๋นํด์ค ์ ์๋ค. ๊ทธ๋ฌ๋ nil์ด ํ ๋น๋์ด ์์ ๋ ์ ๊ทผ์ ์๋ํ๋ฉด ๋ฐํ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
์๋์ ์ฝ๋๋ ์์์ ์ถ์ถ ์ต์ ๋ ๋ณ์์ nil์ด ํ ๋น๋์ด ์์ ๋ ์ฌ์ฉํ๋ฉด ๋ฐ์ํ๋ ์ค๋ฅ ์ํฉ์ ์ฐ์ถํ ์ฝ๋
var myName : String! = "yejin"
print(myName) // yejin
myName = nil
// ์์์ ์ถ์ถ ์ต์
๋๋ ์ต์
๋์ด๋ฏ๋ก ๋น์ฐํ ๋ฐ์ธ๋ฉ์ ์ฌ์ฉํ ์ ์๋ค.
if let name = myName {
print("MyName is \(name)")
} else {
print("MyName == nil")
}
// MyName == nil
myName.isEmpty // ์ค๋ฅ!
๐ ์ ๋ฆฌ
์ต์ ๋์ ์ฌ์ฉํ ๋๋ ๊ฐ์ ์ถ์ถ ๋๋ ์์์ ์ถ์ถ ์ต์ ๋์ ์ฌ์ฉํ๊ธฐ ๋ณด๋ค๋ ์ต์ ๋ ๋ฐ์ธ๋ฉ, nil ๋ณํฉ ์ฐ์ฐ์๋ฅผ ๋น๋กฏํด ๋์ค์ ๋ฐฐ์ธ ์ต์ ๋ ์ฒด์ด๋ ๋ฑ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ํธ์ด ํจ์ฌ ์์ ํ๋ค
๋ํ, ์ด๋ ๊ฒ ํ๋ ๊ฒ์ด ํธ์ด ์ค์ํํธ์ ์งํฅ์ ์ ๋ถํฉํ๋ค!
Reference
Swift ์ค์ํํธ ํ๋ก๊ทธ๋๋ฐ - ์ผ๊ณฐ