Optional,,
Swift ê°ì ê°ëšíê±°ë¡ ë€ììë ìµì
ë ì§ì§ ìŽíŽê° ìê°ë ëŽì©ìŽìëë°
ì€ë êŒ êŒ ìŽíŽíì¬ ë³Žì.
ìµì
ëì Swiftì í¹ì§ ì€ íëìž ìì ì±ì 묞ë²ìŒë¡ ëŽë³Žíë êž°ë¥ìŽë€.
CìžìŽë Object-Cììë ì°Ÿì ì ìë ê°ë
ìŽë€.
ë§ ê·žëë¡, 'ì íì ìž'ìŽëŒë ì믞ìžë°,
ê°ìŽ ìì ìë ìê³ , ìì ìë ììì ëíëžë€.
ìŠ, ë³ì ëë ììì ê°ìŽ nilìŒ ìë ìë€ë ê²ìŽë€.
ìµì ëì ì¥ì ì ìëì ê°ë€.
- ì ë¬ìžìë¡ NULLìŽ ì ë¬ëìŽë ëëì§ ë¬žìì ëª ìíì§ ììë 묞ë²ì ííë§ìŒë¡ ì ì ìë€.
- ìµì ë곌 ìµì ëìŽ ìë ê°ì ì² ì í ë€ë¥ž íì ìŒë¡ ìžìíêž°ì 컎íìŒ ì ì€ë¥ë¥Œ 걞ë¬ëŒ ì ìë€.
ìŽì í¬ì€í
ìì ë€ë£šìë nilì ìµì
ëìì ì¬ì©íë€.
ìµì
ë ë³ì ëë ììê° ìë멎 nilì í ë¹í ì ìë€.
nilì ê°ë
곌 0 ëë ""ì ë€ë¥ž ê°ë
ìŽë€.
0ì 0ìŽëŒë ì«ì륌 ì믞íê³ ""ì ë¹ ë¬žììŽì ì믞íë ê²ìŽë€.
ìŠ, nil(ê°ìŽ ìë€)ì ìë¯žê° ìë ê²ìŽë€.
ë°ëŒì nilë¡ íííë 겜ì°ë ì ë§ ì ë§ ê°ìŽ ì¡Žì¬íì§ ìë 겜ì°ìŽë€.
ìŽë íšìí íë¡ê·žëë°ì ì죌 ë±ì¥íë 몚ëë ê°ë
곌 ìŒë§¥ìíµíë€.
몚ëë ê°ë
ì ëë 몚륞ë€,, ì±
ì ìêžžë ìŒëš ë©ëªšë©ëªš,,
ìë¬ŽíŒ ê·žëì ìµì
ëì ì¬ì©ì ì믞ë ë§ì ê²ì ì¶ìœíë€.
ìµì
ëì ì¬ì©ìŒë¡ ì°ëЬë íŽë¹ ë³ì ëë ììì ê°ìŽ ìì ì ìë€ë ê²ì ì§êŽì ìŒë¡ ì ì ìë€.
ìëì ìì 륌 íµíŽ ìµì
ë ì¬ì©ì ìŽë»ê² íëì§ ë³Žì.
ìµì
ëë¡ ì ìžë ê³³ììë§ nilì ì¬ì©í ì ìë€.
ë°ëŒì ìëì ê°ìŽ ë¬Œìí(?)륌 ë¶ì¬ ìµì
ëì ì ìž íì íŽë¹ ê°ì nilì ë£ìŽìŒì§ë§ ì€ë¥ê° ëì§ ìëë€.
var name: String? = "Mei"
print(name)
name = nil
print(name)
Optional("Mei")
nil
ìµì
ëì ìì ìì ì ê°ìŽ var name: String? = "Mei" ìŽë¬í ííë¡ ì ìžíŽë ëì§ë§,
var name: Optional<String> ìŽë ê² ëª
ííê² ìšì€ ìë ìë€.
íì§ë§ 묌ìí륌 ë¶ìŽë ê²ìŽ ë ížíê³ ìœêž°ë ìœêž° ë묞ì ë ë§ìŽ ì¬ì©íë€.
ìµì
ëì êµ³ìŽ êµ³ìŽ ì°ë ìŽì ì ìë¡ íšìì ì ë¬ìžì ê°ìŽ ì못ë ê²œì° (ê°ëší ì€ë¥ëŒë©Ž) ì ëë¡ ì²ëЬíì§ ëª»íìì nilì ë°ííì¬ íííë ê²ì ë€ ì ìë€.
ëë, ë§€ê°ë³ì륌 êµ³ìŽ ëêž°ì§ ììë ëë€ë ë»ìŒë¡ ë§€ê°ë³ìì íì
ì ìµì
ëë¡ ì ìí ìë ìë€.
ìëì ê°ì ìì ê°ì íµí ìŽê±°í ìŽêž°í ìì 륌 볎ì.
let primary = School(rawValue: "ì ì¹ì")
let graduate = School(rawValue: "ëíì")
ìì ìì ììë ë€ë¥ž ëì ë¬ëЬ, ë³ìë ìì ë€ì ë°ìŽí° íì
ì ëª
ìíŽì£Œì§ ìê³ ë°ìŽí° íì
ì¶ë¡ êž°ë¥ì ì¬ì©íë€.
ìŽë ê² í ìŽì ë nilì í ë¹íë 겜ì°ê° ìêž°êž° ë묞ìŽë€.
ìì ìì ììë primary ì graduate ììì ë°ìŽí° íì
ì School?ëŒê³ ì¶ë¡ íê² ëë€.
ìì ê°ìŽ ìŽê±°íì caseì íŽë¹íì§ ììŒë©Ž ìŽê±°í ìžì€íŽì€ ìì±ì ì€íšíì¬, nilì ë°ííë€.
ìŽë íšìì ì²ëЬ ì€íš ì íì íŽë¹íë€.
ìëì ìœëë ìµì ëì ì ììŽë€.
public enum Optinal<Wrapped> : ExpressibleByNilLiteral {
case none
case some(Wrapped)
public init(_ some: Wrapped)
/// more ...
}
ìì ìœë(ìµì
ëì ì ì)륌 볎멎 ìµì
ëì ì ë€ëŠìŽ ì ì©ë ìŽê±°íìŽë€.
ExpressibleByNilLiteral íë¡í ìœì ë°ë¥Žë ê²ë íìží ì ìë€.
ì¬êž°ì ì€ìí ê²ì ìŽê²ìŽë€.
ìµì ëì ê°ì ê°ë ìŒìŽì€ì ê·žë ì§ ëª»í ìŒìŽì€ ë ê°ì§ë¡ ì ìëìŽ ìì
=> nilìŒëë none ìŒìŽì€ê° ëë©°, ê°ìŽ ìë ê²œì° some ìŒìŽì€ê° ëš
=> ê°ìŽ ìë ê²œì° some ìŒìŽì€ê° ëë¯ë¡, someì ì°êŽ ê°ìž Wrappedì ê°ìŽ í ë¹ëš
ìµì
ëì ìŽê±°íìŽêž° ë묞ì, ìµì
ë ë³ìë switch 구묞ì íµíŽ ê°ìŽ ìê³ ììì í ì ìë€.
ìëì ê°ìŽ íìžìŽ ê°ë¥íë€.
func checkOptionalValue(value optionalValue: Any?){
switch optionalValue {
case .none:
print("This Optional variable is nil")
case .some(let value):
print("Value is \(value)")
}
}
var name: String? = "Mei"
checkOptionalValue(value: name)
name = nil
checkOptionalValue(value: name)
Value is Mei
This Optional variable is nil
ì ìì ìì í switch륌 íµí ìµì
ë ê° íìžìì where ì ì ê²°í©í멎 ì¢ ë ìžë šëê² ìœë륌 ìì±í ì ìë€.
ìì ë ë€ì곌 ê°ë€. (ìŽ ìì ë whereì ì ê³µë¶íê³ ë€ì 볎멎 ì¢ì ë¯ íë€.)
let nums: [Int?] = [2, nil, -2, 0]
for num in nums {
switch num {
case .some(let value) where value < 0:
print("Negative value")
case .some(let value) where value > 0:
print("Positive value")
case .some:
print("Zero")
case .none:
print("Nil !!")
}
}
ìµì
ëì switch 구묞ì íµíŽ ë§€ë² ê°ìŽ ìëì§ íìžíë ê²ì ë§€ì° ë¶ížíë€.
ë°ëŒì ìµì
ë íì
ìì ê°ì ì¡°êž ë ìì íê³ ížëЬíê² ì¶ì¶íë ë°©ë²ì ì멎 ì¢ë€.
ìµì
ë ê°ì ì¶ì¶ ë°©ìì ìµì
ëì ê°ì ì¶ì¶íë ë°©ë² ì€ ê°ì¥ ê°ëšíì§ë§ ê°ì¥ ìíí ë°©ë²ìŽë€.
ë°©ë²ì ìµì
ë ê°ì ë€ì ëëí(!)륌 ë¶ì¬ì£Œë ê²ìŽë€.
ë§ìœ ê°ì ì¶ì¶ ì ìµì
ëì ê°ìŽ nilìŽëŒë©Ž, ë°íì ì€ë¥ê° ë°ìíë€.
ë°ëŒì ë°íì ì€ë¥ì ê°ë¥ì±ì íì ëŽí¬íêž° ë묞ì ê°ì ì¶ì¶ ë°©ìì ì§ìíŽìŒ íë€.
ì¬ì©ë²ì ìë ìì 륌 ì°žê³ íì.
var name: String? = "Mei"
print(name)
var mei = name!
print(mei)
name = nil
mei = name!
print(mei)
// 조걎묞ì ì¬ì©í멎 ì¡°êž ë ìì íê² ì²ëЬ ê°ë¥
if name != nil {
print("My name is \(name!)")
}
else {
print("name is nil")
}
ìµì
ë ê°ì ì¶ì¶ìì if 구묞ì ì¬ì©íë ë°©ë²ì ë€ë¥ž íë¡ê·žëë° ìžìŽìì NULL ê°ì 첎í¬íë ë°©ì곌 ë¹ì·íë€.
ê·žë¬ë©Ž ìµì
ëì ì¬ì©íë ì믞ë ì¬ëŒì§ë€.
ë°ëŒì Swiftë ì¡°êž ë ìì íê³ ìžë šë ë°©ë²ìŒë¡ ìµì
ë ë°ìžë©ì ì ê³µíë€.
ìµì
ë ë°ìžë©ì ìµì
ëì ê°ìŽ ìëì§ íìží ë ì¬ì©íë€.
ë§ìœ ìµì
ëì ê°ìŽ ììŒë©Ž,
ì¶ì¶í ê°ì ìŒì ëžë¡ ììì ì¬ì©í ì ìë ììë ë³ìë¡ í ë¹íì¬ ìµì
ëìŽ ìë ííë¡ ì¬ì©í ì ìëë¡ íë€.
ìµì ë ë°ìžë©ì ìë ìì ì ê°ìŽ if ëë while 구묞 ë±ê³Œ ê²°í©íì¬ ì¬ì©ìŽ ê°ë¥íë€.
var name: String? = "Mei"
// ìµì
ë ë°ìžë©ì íµí ìì ìì í ë¹
if let me = name {
print("i am \(me)")
}
else {
print("name is nil")
}
// ìµì
ë ë°ìžë©ì íµí ìì ë³ì í ë¹
if var me = name {
name = "Vina"
print("i am \(name)")
}
else {
print("name == nil")
}
ìµì
ë ë°ìžë©ì ìµì
ë 첎ìŽë곌 íìì ê²°í©ì ìŽë£¬ë€.
ìŽë ìµì
ë 첎ìŽë ì 늬ìì ì 늬íëë¡ íë€.
nilì í ë¹íê³ ì¶ì§ë§, ìµì
ë ë°ìžë©ìŒë¡ ë§€ë² ê°ì ì¶ì¶íêž° ê·ì°®ê±°ë
ë¡ì§ì nil ë묞ì ë°íì ì€ë¥ê° ë°ìíì§ ìì ê² ê°ë€ë íì ìŽ ëë 겜ì°ê° ìë€.
ìŽë° 겜ì°ìë nilì í ë¹íŽì€ ì ìë ìµì
ëìŽ ìë ë³ìë ììê° ììŒë©Ž ì¢ì ê²ìŽë€.
ìŽë ì¬ì©íë ê²ìŽ ë°ë¡ ììì ì¶ì¶ ìµì
ëìŽë€.
ììì ì¶ì¶ ìµì
ëì ì¬ì©íë €ë©Ž íì
ë€ì ëëí(!)륌 ì¬ì©í멎 ëë€.
ììì ì¶ì¶ ìµì
ëë¡ ì§ì ë íì
ì ìŒë° ê°ì²ëŒ ì¬ì©ìŽ ê°ë¥íë€.
íì§ë§ ìŽë ìµì
ëìŽêž° ë묞ì nilìŽ í ë¹ëìŽ ìëë° ìë ìì ì ê°ìŽ ì ê·Œì ìëí멎 ë°íì ì€ë¥ê° ë°ìíë€.
var name: String! = "Mei"
print(name)
name = nil
if let nameCheck = name {
print("i am \(name)")
}
else {
print("name == nil")
}
name.isEmpty
ì§ì§,, ê°ê° ì + ì¶ìì°íŽì íê³ë¡ ì죌 ìŒë¬Žì§ê² ëê³ ìì 4390481ë
ë§ì í¬ì€í
ìŽë€.
ìíŒ ì ëìë ëìë ëê³ ì¶ìì§..
ëŽê° ë
žë ì¬ìŽ xcodeê° ì
ë°ìŽíž ëìë€.
ê·Œë° ë¬žì ë ëŽê° ì ë²ì ê·ì°®ìì ì±ì€í ìŽìì ë€ìŽë¡ë íìëë°,
ì
ë°ìŽíž 묎í ë¡ë©ìŽ ëëëŒ,,^__ã
ë묌ì ëšžêžê³ ,, ë€ì ìží°ë·ìŒë¡ ë€ìŽë¡ë íë€.
ìíŒ,, ê·žë¬ë€,,
ìŽì ë€ì ê³µë¶ ì¢ íì.
ê·žë¬ê³ 볎ë êµëì ì¢
í©ìíë ìë€.(2죌ë ìëšìëë°, íµê³ŒíŽìŒ 졞ì
íë€.)
ê·Œë° ê³µë¶ë¥Œ ìíë€.
ê³µë¶ ì¢ íŽëŒ ì ë°,, ìììì ð¯âš