๊ธฐ๋ณธํ
var ๋ณ๋์ด๋ฆ : ํ์
var ๋ณ๋์ด๋ฆ : ์ต์
๋<ํ์
>
//ํํํ๋๋ฐ์ 2๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์.
var optionalType1: String? // ์๋ ์ด๊ธฐํ nil //๊ฐ์ด ์๋ ๊ฒ์ผ๋ก ์ด๊ธฐํ๋จ var optionalType1: String = nil ๊ณผ ๋์ผ
var optionalType2: Optional<Int> = nil // ์๋ ์ด๊ธฐํ. (๊ฐ ๋๋ nil)
optionalType1
type(of: optionalType1)
type(of: optionalType2)
// Valueless state - nil
var optionalIntInit = Optional<Int>(0)
var optionalInt: Int? = 0
type(of: optionalInt)
optionalInt = nil
optionalInt
// Optional -> NonOptional
//var nonOptional1 = nil
//var nonOptional2: Int = nil
//var nonOptionalType: Int = optionalInt
// Optional <- NonOptional
let nonOptional = 1
optionalInt = nonOptional
optionalInt = 100
// Optional -> NonOptional (X)
// Optional <- NonOptional (O)
// ์ต์
-> ๋
ผ๋ถ๊ฐ.
//๋
ผ์ต์
๋์ ์ต์
๋์ ๋ฃ๋๊ฒ์ ๊ด์ฐฎ
// ๊ฐ ํ์
์ด ๊ฐ์ง ์ ์๋ ๊ฐ์ ๋ฒ์
// var nonOptionalNumber: Int // ์ ์ ๊ฐ๋ฅ
// var optionalNumber: Int? // ์ ์ or nil ๊ฐ๋ฅ
var convertedNumber: Int? = 123
if convertedNumber != nil {
// warning + Optional(123)
print("convertedNumber has an integer value of \(convertedNumber).")
}
- ์๋์ ๊ฑฐ, ์ต์ ๋ ์ฐ์ง์๊ณ if๋ฌธ ์์์ ๋ค๋ฃฐ์ ์๊ฒ
๊ธฐ๋ณธํ
if let ๋
ผ์ต์
๋ = ์ต์
๋ํํ {
์คํ์ฝ๋
//} else {
//print("nill") ์ด๋ฐ์์ผ๋ก
while let ๋
ผ์ต์
๋ = ์ต์
๋ํํ {
์คํ์ฝ๋
}
guard let ๋
ผ์ต์
๋ = ์ต์
๋ํํ else {
์คํ์ฝ๋
}
let someValue = "100"
if let number = Int(someValue) {
print("\"\(someValue)\" has an integer value of \(number)")
} else {
print("Could not be converted to an integer")
}
//์ต์
๋ 100 //๊ฐ์ด ์์ผ๋ฉด else, ๊ฐ์ด ์์ผ๋ฉด number์ ๋ด๊ฒจ์ ์คํ
//"100" has an integer value of 100
var optionalStr: String? = "Hello, Optional"
print(optionalStr)
if let optionalStr = optionalStr {
print(optionalStr)
} else {
print("valueless string")
}
// ์ฌ๋ฌ ๊ฐ์ ์ต์
๋ ๋ฐ์ธ๋ฉ๊ณผ ๋ถ๋ฆฌ์ธ ์กฐ๊ฑด์ ํจ๊ป ์ฌ์ฉ ๊ฐ๋ฅ
if let firstNumber = Int("4"),
let secondNumber = Int("42"),
firstNumber < secondNumber,
secondNumber < 100 {
print("\(firstNumber) < \(secondNumber) < 100")
}
//๋ชจ๋ ์กฐ๊ฑด์ ๋ง์กฑํ์ ๋, ์คํ
// ์์ ๋์ผํ ๋์
if let firstNumber = Int("4") {
if let secondNumber = Int("42") {
if firstNumber < secondNumber, secondNumber < 100 {
print("\(firstNumber) < \(secondNumber) < 100")
}
}
}
let ๋
ผ์ต์
๋ = ์ต์
๋ํํ!
// !๋ ๋ฐ๋์๊ฐ์ด ์๋ค! ๋ฅผ ์๋ ค์ฃผ๋ ๊ฒ
if convertedNumber != nil {
// print("convertedNumber has an integer value of \(convertedNumber).")
print("convertedNumber has an integer value of \(convertedNumber!).")
}
print(convertedNumber)
print(convertedNumber!)
// Forced unwrap of nil value
//nil์ผ๋ !๋ฅผ ๋ถ์ด๊ณ ์คํํ๋ฉด ๋ฐํ์ ์๋ฌ. :๊ฐ์ด ์๋ค๊ณ ํด๋๊ณ ๋, ๊ฐ์ด ์์ด์ ์๋ฌ๋จ. (ํ์คํ ๋๋ง !๋ฅผ ์ฐ๊ณ , ํ์คํ์ง์์๋๋ ์ต์
๋์ ๋ค๋ค์ผํจ)
convertedNumber = nil
convertedNumber
//convertedNumber!
// Optional
let possibleString: String? = "An optional string."
//let forcedString: String = possibleString // Error
let forcedString: String = possibleString!
type(of: possibleString)
type(of: forcedString)
// Implicitly Unwrapped Optional
// Non Optional ํ์
์ธ ๊ฒ์ฒ๋ผ ํจ๊ป ์ฌ์ฉ ๊ฐ๋ฅ
var assumedString: String! = "An implicitly unwrapped optional string."
let stillOptionalString = assumedString
type(of: assumedString)
type(of: stillOptionalString)
print(assumedString)
print(assumedString!)
//?์ผ๋๋ ๋ฃ์ง ๋ชปํ๋๋ฐ !์ผ๋๋ ๋ฃ์ ์ ์์. ๋ฐ๋์ ๊ฐ์ด ์๋ค๊ณ ์๋ ค์ฃผ๊ณ ์๊ธฐ ๋๋ฌธ.
//Optional - >nonOptional(x)
//String? - > String(x)
//String! -> String(o)
let implicitString: String = assumedString
type(of: implicitString)
//assumedString = nil
//print(assumedString!)
/*
- ์ถํ ์ด๋ ์๊ฐ์์๋ผ๋ nil ์ด ๋ ์ ์๋ ๊ฒฝ์ฐ์๋ ์ด ๊ฒ์ ์ฌ์ฉํ์ง ๋ง์์ผ ํจ
- nil value ๋ฅผ ์ฒดํฌํด์ผ ํ ์ผ์ด ์๊ธธ ๊ฒฝ์ฐ๋ ์ผ๋ฐ์ ์ธ ์ต์
๋ ํ์
์ฌ์ฉ
- ํ๋กํผํฐ ์ง์ฐ ์ด๊ธฐํ์ ๋ง์ด ์ฌ์ฉ//์ผ๋จ ํ๋กํผํฐ๋ ๋ง๋ค์ด๋๋๋ฐ, ๋ค ๋ฆ๊ฒ ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์๋?
*/
optionalStr = nil
var result = ""
if optionalStr != nil {
result = optionalStr!
} else {
result = "This is a nil value"
}
print(optionalStr)
print(result)
//optionalStr์ด nil์ผ๋ ์คํ.
//๊ฐ์ํ ์คํ. nil์ผ์๋, ๊ฐ์ด ์์ ์๋ ์๋ ์ํฉ์ ??์ ๋ฃ์ผ๋ฉด ๋ค์๊ฒ์ ๋ฌด์ํ๊ณ ์คํ.
let anotherExpression = optionalStr ?? "This is a nil value"
print(optionalStr)
print(anotherExpression)// nill์ธ์ง ์๋์ง ์ฒดํฌ ์ด๋ฏธ ํ๊ธฐ๋๋ฌธ์ ์ต์
๋๋ฐ์ธ๋ฉ ํ์ง ์์.
let optionalInteger: Int? = 100
let anotherExpression2 = optionalInteger ?? -1 //??=100
print(anotherExpression2)
// ์ด๋์ ์ฐ์ผ ์ ์์๊น์?
// Example
let defaultColorName = "red"//๊ธฐ๋ณธ์ปฌ๋ฌ์
var userDefinedColorName: String?//์ต์
๋ : ์ ์ ๊ฐ ์ ์ํ ์ปฌ๋ฌ๊ฐ ์์ผ๋ฉด ๊ธฐ๋ณธ ์์์ ์ฐ๋๋ก.
var colorNameToUse = userDefinedColorName ?? defaultColorName
print(colorNameToUse)
userDefinedColorName = "green"
colorNameToUse = userDefinedColorName ?? defaultColorName
print(colorNameToUse)
//0 > 2 ? a: b
//isTrue a:b
//?://์ฐธ๊ณผ ๊ฑฐ์ง
//??//์ต์
๋์ ๋ค๋ฃจ๊ธฐ์ํ ๊ฒ.
- isTrue ? a : b ์์ ์ฐจ์ด
- optionalStr ?? "This is a nil value" ๋ฅผ 3ํญ ์ฐ์ฐ์๋ก ๋ฐ๊ฟ๋ณด๊ธฐ
let answer1 = optionalStr ?? "This is a nil value"
//->3ํญ์ฐ์ฐ์๋ก
let answer2 = optionalStr != nil ? optionalStr! : "This is a nil value"
//nil์ด ์๋์ง ์๋์ง ์ฒดํฌ
let answer3 = optionalStr == nil ? "This is a nil value" : optionalStr!
//ํธ๋ฃจ์ผ๋ ์, ํ์ค์ผ๋ ๋ค
//nil์ผ๋ ~์ ํ๊ฒ ๋ค.
if let binding = optionalStr {
}
// Oprional - > nonOprional
let str1: String = "A" // nil ๋ฃ์ ์ ์์
let str2: String! = "A" //nil์ ๋ฃ์ ์๋ ์๋๋ฐ ํน์ ๊ฐ์ด ์๋ค๊ณ ์๊ฐํ๊ณ ์
type(of: str1)
type(of: str2)
let greeting: [String: String] = [
"John": "Wassup",
"Jane": "Morning",
"Edward": "Yo",
"Tom": "Howdy",
"James": "Sup"
]
print(greeting["John"])
print(greeting["John"]?.count)//๋ฐ๋์ ?๋ฅผ ์จ์ผํจ
print(greeting["NoName"]) //nil
// Optional Chaining
print(greeting["John"]?.lowercased().uppercased()) //์ต์
๋ ์๋๋ฉด nil
print(greeting["Alice"]?.lowercased().uppercased())//nil //Alice๋ ์๊ธฐ ๋๋ฌธ์
//print(greeting["Alice"]!.lowercased().uppercased())// nil์ผ๋ !ํ๋ฉด ์ค๋ฅ๋จ. // ๋ฐ๋์ ๊ฐ์ด ์์๋๋ง !๋ฅผ ์
// Optional Binding
if let greetingValue = greeting["John"] {
print(greetingValue.lowercased().uppercased())
}
- ์๋ ๋ ์ข ๋ฅ ์ต์ ๋์ ์ฐจ์ด์ ์ด ๋ฌด์์ผ๊น์?
var optionalArr1: [Int]? = [1,2,3] //๋ฐฐ์ด ์ต์
๋
var optionalArr2: [Int?] = [1,2,3] //
var arr1: [Int]? = [1,2,3] //๊ฐ์ ์ต์
๋์ด์๋๊ณ ๋ฐ๋์ ์ธํธํ์
. ํ์ง๋ง ๋ฐฐ์ด์์ฒด๊ฐ nil์ผ์๋ ์๊ณ ๊ฐ์ด ์์์๋ ์๊ณ ์ ๋ป.
//arr1.append(nil)
//arr1 = nil
print(arr1?.count)//Optional(3)
print(arr1?[1]) //Optional(2)
var arr2: [Int?] = [1,2,3] //๋ฐฐ์ด์ ์๋๋ฐ, ๋ฐฐ์ด ์์ nil์ด ์์ ์๋ ์์.
arr2.append(nil) //[1, 2, 3, nil]
//arr2 = nil //๋น ๋ฐฐ์ด์ ์ง์ด๋ฃ๋ ๊ฒ์ ๋๋๋ฐ, nil์ ๋ฃ์ ์ ์์.
print(arr2.count)
//print(arr2[1])
print(arr2.last) //"Optional(nil)
//input parameter, output return type
func voidFunction() {//func voidFunction() -> () {
print("voidFunction is called")
}
//var functionVariable: () -> () = voidFunction
var functionVariable: (() -> ())? = voidFunction //๋ณด์ด๋ ํ์
์ ์ต์
๋์ ์ง์ด ๋ฃ์.
functionVariable?()
//functionVariable = nil
//functionVariable()
functionVariable = nil
functionVariable?()
func sum(a: Int, b: Int) -> Int {
a + b
}
sum(a: 2, b: 3)
//var sumFunction: (Int, Int) -> Int = sum(a:b:)
var sumFunction: ((Int, Int) -> Int)? = sum(a:b:) //sum์ด๋ผ๋ ํจ์์ a์ b๋ผ๋ ํ๋ผ๋ฏธํฐ์ ๋ณ์์ ๋ด์ ์ ์๋ค..
type(of: sumFunction)
print(sumFunction?(1, 2))//Optional(3)
//print(sumFunction!(1, 2)) //3
//sumFunction = nil
//sumFunction?(1, 2) //nil์ฌ ์๋ ์๊ณ ์์ฌ์๋ ์๊ณ
//sumFunction!(1, 2) //!์ '๋ฐ๋์ ๊ฐ์ด ์๋ค' ์ ๋ง์ง์์ ์ค๋ฅ๋ฐ์
//
var dict1: [String:String?] = [:]
// a : b
//?๋ฃ์ผ๋ฉด b์ nil์ธ์ ์์
- 2๊ฐ์ ์ ์๋ฅผ ์ ๋ ฅ๋ฐ์ Modulo ์ฐ์ฐ(%)์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ํจ์๋ฅผ ๋ง๋ค๋, 2๋ฒ์งธ ํ๋ผ๋ฏธํฐ์ ๊ฒฐ๊ณผ๊ฐ์ ํ์ ์ ์ต์ ๋๋ก ์ ์.
- ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ ์ ๋ ฅ๊ฐ์ผ๋ก nil ์ด๋ 0์ด ๋ค์ด์ค๋ฉด ๊ฒฐ๊ณผ๋ก nil์ ๋ฐํํ๊ณ , ๊ทธ ์ธ์๋ ๊ณ์ฐ ๊ฒฐ๊ณผ ๋ฐํ
}
// OptionalStr ?? "This is a nil value" ๋ฅผ 3ํญ ์ฐ์ฐ์๋ก ๋ฐ๊ฟ๋ณด๊ธฐ
let answer = optionalStr != nil ? optionalStr! : "This is a nil value"
// 2๊ฐ์ ์ ์๋ฅผ ์
๋ ฅ๋ฐ์ Modulo ์ฐ์ฐ(%)์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ํจ์
func calculateModulo(op1: Int, op2: Int?) -> Int? {
guard let op2 = op2, op2 != 0/*0์ด ์๋๊ฒฝ์ฐ*/ else { return nil }
return op1 % op2
}
calculateModulo(op1: 10, op2: 4)
calculateModulo(op1: 39, op2: 5)