Apple "The Swift Programming Language (Swift 3.0.1)" ์ธ์ด ๋ฌธ์๋ฅผ ๊ณต๋ถํฉ๋๋ค.
#####๋ชฉํ
-
Daily Commit.
-
์ธ์ด ๊ธฐ๋ณธ์ฌ์ฉ์ ์ต์ํด์ง๊ธฐ.
-
์ธ์ด์ ๊ธฐ๋ณธ์ฌ์ฉ์ ์ต์ํด์ง๊ธฐ.
###๊ธฐ๋ณธ.. - ์ธ๋ฏธ์ฝ๋ก ๋ ์ด์ ํ์ํ์ง ์๋ค. - constnat value ์ธ let์ ๊ผญ 1๋ฒ๋ง ์ ์ธํด์ผํ๋ค.(ํ๋ฒ์ ์ธํ๊ณ ๋ง์๊ณณ์์ ์ฌ์ฉํ ๋) - ํ์ ์ ์ด๊ธฐ init์ผ๋์ ๊ฐ์ผ๋ก ๊ธฐ์ตํ๋ค. - value๋ ์ ๋๋ก ์์ฐ์ค ๋ค๋ฅธํ์ ์ผ๋ก ๋ณํ์ง ์๋๋ค. (์ฆ ํ๋ฒ์ ์ธํ๋ฉด ๊ณ์ ๊ทธํ์ ์ผ๋ก ๊ฐ์ง๋ค๋์ด์ผ๊ธฐ) - ํด์ String(value)๋ฑ์ผ- ๋ก value๋ฅผ ํ๋ณํํด์ฃผ์ผํ๋ค. - ์คํธ๋ง ๋ด๋ถ์์ ์ธ๋ ๋ฐฑ์ฌ๋์๋ฅผ ํตํด ํ์ ์ ์คํธ๋งํํ ์์๋ค.\(value
###array,dictionary..
- array,dictionaryํ์ ์ bracket์ ์ด๋ค
- String, String:Float ์ผ๋ก ์ด๊ธฐํํ๊ณ ๊ธฐ์กด ๊ฒ์ [], [:] ์ผ๋ก ์ด๊ธฐํํ๋ค
- a ?? b ๋ a๊ฐ ์ต์ ๋๋ฐธ๋ฅ์ด๊ณ null์ด๋๊ฒ๋๋ฉด b๊ฐ default๋ก ๋ค์ด๊ฐ๋ค๋ ์๋ฏธ์ด๋ค.
- optionalValue์ nill์ด ๋ค์ด ๊ฐ ์ ์๋ value ์ด๊ณ ํด๋น nil์๋ํด ๋ฐํ์์๋ฌ๋ฅผ ์ฌ์ ์ ์ปดํ์ผ์๋ฌ๋ก ๋ฐฉ์งํ๊ธฐ์ํจ์ด๋ค. (swift๊ฐ type safeํ ์ธ์ด์ธ ์ด์ )
###Loop..
- for i in 0..<4 0~3๊น์ง.
- for i in 0โฆ4 0~4๊น์ง.
- do while => repeat while ์ ๋..
###func..
-
ํ๋ผ๋ฏธํฐ์ ์ธ๋๋ฐ๋ฅผ ๋จผ์ ์ฐ๊ฒ๋๋ฉด => ์ด๋ ํ๋ผ๋ฏธํฐ๋ช ์ ์๋ตํด๋๋๋ค. on day ์ด๋ฐ์์ผ๋ก ๋์ด์ฐ๋ฉด ์์ on์ ํ๋ผ๋ฏธํฐ๋ช ์ผ๋ก ์ฐ๊ฒ๋ค.( greet(_ person:String, on day:String)->String{}...
-
ํจ์๋ ๋ฆฌํด๊ฐ์ ์ฌ๋ฌ๊ฐ๋ก ์ฌ์ฉํ ์๋ ์๋ค.
-
sumOf(numbers: Intโฆ) -> int {} ์๊ฐ์ด ๋ง์ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐฐ์ด๋ก ๋ฐ์ ์ ์๋ค.
-
nestedFunction์ ์ฌ์ฉํ ์์๋ค. ํจ์๋ด์ ํจ์๊ฐ ๊ฐ๋ฅํ๋ฉฐ ๋ธ๋ฝ์์ variable์ ๊ณต์ ๋๋ค.
-
๋ด๋ถํจ์๋ฅผ ๋ฆฌํฐํด ์ค์๋ ์๋ค. ๊ทธ๋ด๋ ์ต์ด ๊ฒ์ ํจ์์ ๋ฆฌํดํ์ ์ด ๋ด๋ถํจ์์ ํ๋ผ๋ฏธํฐ,๋ฆฌํดํ์ ๊ณผ ๊ฐ์์ผํ๋ค.(func test() -> ((Int)->(int){} ๋ผ๋ฉด ๋ด๋ถ์ func testt(number:Int) -> Int {} ๊ฐ์ ํจ์๊ฐ ์กด์ฌํ์ฌ์ผ ํ๋ค.
-
๋ด๋ถ ํจ์์ ๊ฒฝ์ฐ ์กฐ๊ฑด์ด ๋ค์ด๊ฐ ์๋์๋ค.
-
array.map์ ํด๋ก์ ๋ก ๊ฐ ํญ๋ชฉ๋ค์ ๋ฐ์ํ ๊ฒฐ๊ณผ๋ฌผ์ ๊ฐ์ง ์๋ก์ด ๋ฐฐ์ด์ ๋ฐํํ๋ค.
//๋ฐฐ์ด์ ์ ์ธ let numbers = [1,2,3,4] //map์ํตํด ๋ด๋ถ ๋ธ๋ฝํจ์๋ก ๋๋ฆฐ ๊ฒฐ๊ณผ์ ๋ฐฐ์ด์ ๋ฆฌํดํ๋ค. let data = numbers.map({ (number:Int) -> Int in return 3*number }) -
ํด๋ก์ ธ์์ ๋ฐ๋ ์ธ์๋ $0 $1 ... ๋ฑ๊ณผ๊ฐ์ด ๊ฐ๋จํ ๋ฐ์ ์ ์๋ค.
###Class..
-
ํด๋์ค๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฉค๋ฒ๋ณ์, ๊ทธ๋ฆฌ๊ณ ํจ์๋ก ์ด๋ฃจ์ด์ ธ์๋ค.
-
init์ ํตํด ์์ฑ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
//์ ๊ฐ์ด ์์ํ ์์๋ค. class Square: NamedShape{} -
super.init()์ ํตํด ์์ ํด๋์ค์ ์์ฑ์๋ฅผ ๋ง๋ค์์๊ณ ,
-
override ๋ฌธ๊ตฌ๋ฅผ ํตํด ๋ถ๋ชจ ํด๋์ค์ ํจ์๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํ ์ ์๋ค.
-
value์ get{}, set{} ์ ๋ฃ์ ์ ์๊ณ ํด๋น ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฅ ๋ถ๋ฌ์ ์ฌ์ฉํ๋ฉด get{}์ด ํธ์ถ๋๊ณ ์ค์ ํ๋ฉด set{}์ด ์ค์ ๋๋ค.
var permieter: Double{
get {
return 3.0 * sideLength
}
set {
sideLength = newValue / 3.0
}
}
- setter์ newValue๋ ์์๋ ์๋ก์ด ๊ฐ์ ์๋ฏธํ๋ค.
###Enum..
enum Rank: Int{
ace = 1
}
- Rank.ace ๋ ace๋ฅผ ๋ฐํํ๋ค.
- rawValue๋ฅผ ์ด์ฉํด ์ซ์๊ฐ์ ๋ฐ์์ฌ ์ ์๋ค.(Rank.ace.rawValue ๋ 1์ ๋ฐํํ๋ค.)
- ์ ์์ ์์์ enum ์ ์์ฑ์๋ก ๊ธฐ๋ณธ Rank(rawVlaue:)๋ฅผ ๊ฐ์ง๊ณ ํด๋น ๋ฌธ์๋ฅผ ๋ฆฌํดํ๋ค.
- enum์ผ๋ก case๋ฅผ ๋ถ๋ฅํ์ฌ ํด๋น case์ผ ๊ฒฝ์ฐ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐ์ง๊ณ ์ด๋ป๊ฒ ๋ณด์ฌ์ค ๊ฒ์ธ์ง ๋ํ๋ธ๋ค.
- struct๋ ๊ตฌ์กฐ์ฒด๋ฅผ ๋ง๋ ๋ค. ํด๋์ค์ ๊ฐ์ง๋ง ํด๋์ค๋ ์ฐธ์กฐํ๋ ๋ฐ๋ฉด ๊ตฌ์กฐ์ฒด๋ ๋งค๋ฒ ๋ณต์ฌํ๋ ํํ๋ค
###Protocol..
- ํ๋กํ ์ฝ์ ์ธํฐํ์ด์ค๋ค. ์ต์ํ ๊ฐ์ ์ผํ ์์ฑ ๋ฉ์๋๋ฑ์ ๊ฐ์ง๋ค.
- struct๋ ์ด๊ฑฐํ์์ผ๋ก value์ ํ์ ๋ฑ์ ๋ณ๊ฒฝํ ์ ์๋ค. ๊ทธ๋ฌ๋ mutating keyword๋ฅผ ํตํ๋ฉด ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๋ค.
###Extension..
extension Int: ExampleProtocol {
var simpleDescription: String {
return "the number \(self)"
}
mutating func adjust() {
self += 42
}
}
print(7.simpleDescription)
- ์นดํ ๊ณ ๋ฆฌ์ด๋ค ์์๊ฐ์ด ๊ธฐ๋ณธ ํ์ Int์ simpleDescription์ด๋ผ๋ ํจ์๋ฅผ ์ถ๊ฐํด์ ์ฌ์ฉํ๋ค.
let protocolValue: ExampleProtocol = a
- ์์๊ฐ์ด ๊ธฐ์กด ํด๋์ค์ variable๋ก ํ๋กํ ์ฝ์ ์ถ๊ฐ ํ ์ ์๋ค.
###ErrorHandler..
enum PrintError: Error {
case OutOfPaper
case noToner
case onFire
}
func send(job: Int, toPrinter printerName: String) throws -> String {
if printerName == "Never Has Toner"{
throw PrintError.noToner
}
return "job sent"
}
do{
let printerResponse = try send(job:1040,toPrinter:"Never Has Toner")
}catch{
print(error)
}
- ์๋ฌ ์ผ์ด์ค๋ฅผ enum: Error๋ก ์์ฑํ ์ ์๋ค.
- ํด๋น ์๋ฌ๋ฅผ try catch๋ก ์ก์์ ์๊ณ throw๋ฅผ ํตํด ์๋ฌ๋ฅผ ๋ฐ์์ํจ๋ค.
- differ{} ๋ ํจ์๋ด๋ถ์ ๋ชจ๋ ์ฝ๋์์ ๊ฐ์ฅ ๋ง์ง๋ง์ ์คํ๋๋ค.
###Generics..
//itemํ์
์ผ๋ก ๋ฐฐ์ด์ ๋ง๋ค๊ณ ๊ณ์ ์์ดํ
ํ์
์ผ๋ก appendํ๊ฒ ๋ค.
func makeArray<Item>(repeating item: Item, numberOfTime: Int) -> [Item]{
var rsult = [Item]()
for _ in 0..<numberOfTime{
rsult.append(item)
}
return rsult
}
makeArray(repeating: "knock", numberOfTime: 4)
- ํ์ ์ ์์ ๋ก์ด ์ ๋ค๋ฆญ ํจ์์ด๋ค.
###TypeSafety..
- ์ค์ํํธ๋ ํ์ ์ธ์ดํํ๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก typeAnotation์ ํ์ง ์์ ๊ฒฝ์ฐ ํด๋น ํ์ ์ ์ถ๋ก ํด ์ ํฉํ ํ์ ์ผ๋ก ๋ช ์ํ๋ค.
- ์ ๋งํ๋ฉด ํ์ ์ ๋ช ์ํด์ฃผ๋๊ฒ์ด ์ข๊ฒ ๋ค.
###type Conversion..
- ํ๋ณํ์ ์๋์๊ฐ์ดํ๋ค.
let valueDouble = 0.123
let valueInt = Int(valueDouble)
###Type Aliaces
- ํ์ ์ aliasํ ์ ์๋ค.
typealias AudioSample = UInt16
var maxAmplitudeFound = AudioSample.min
- ํํํํ๋ฅผ ์ ๊ณตํด์ค๋ค. ์ฐ๊ธฐ ๋งค์ฐ ๊ฐ๋จํ๋ค~
let http404Request = (404, "not Found")
print(http404Request.0)
print(http404Request.1)
let (code,reason) = http404Request
print(code)
print(reason)
let http200Stauts = (statusCode:200, description: "OK")
print(http200Stauts.statusCode)
print(http200Stauts.description)
###Optional 2
- ์ต์ ๋์ value๊ฐ ์ ๋งคํ ๋ ์ฌ์ฉ๋๋ค.
let possibleNumber = "123"
let convertedNumber = Int(possibleNumber)
print(convertedNumber)
- convertedNumber๋ int ๊ฐ ์๋๋ผ optional(Int)๊ฐ ๋๋ค. ์๋ฏธ๋ ํด๋น ๊ฐ์ด
์ด๋ ํ intํน์nil์ผ ์ ์๋ค๋ ๊ฒ์ด๋ค. - ์ด์ ๋ ์ปดํ์ผ๋ฌ์ ์ฅ์์ possibleNumber๊ฐ String๊ฐ์ด => Int๋ก ๋ณํ๋๋๊ณณ์์ ํญ์ ํด๋น String์ด ์ซ์์์ ๋ณด์ฅ ํ ์ ์๋ ์ํ์ด๋ค. ์ฆ "sample" ๊ฐ์ ํ ์คํธ๊ฐ ๋ค์ด๊ฐ๊ฒ๋๋ฉด Int๋ณํ์์ nil๊ฐ์ด ๋์ถ๋์๋ ์๋ ์ํ์ธ๊ฒ์ด๋ค.
๊ณ ๋ก ๋งค์ฐ ์ ๋งคํ ์ํ๋ค, ์ด๋ฌํ ์ํ๊ฐ ์กด์ฌํด๋ฒ๋ฆฌ๋ฉด safe ํ์ง ์๋ค.
- ์์๊ฐ์ ์ํฉ์ ์๋ ค์ฃผ๊ณ ํด๋น ์ํฉ์ ๋ณด๋ค safeํ๊ฒ ๋ณํ์์ผ์ค ํ์๊ฐ ์๋ค.
###OptionalBinding
- ์ต์ ๋ ๋ฐ์ธ๋๋ค. ํด๋น ๊ฐ์ด nil๊ฐ์ธ์ง ์ฒดํฌํ๊ฒ ๋์ด ๋ณด๋ค safeํ ์ฝ๋๊ฐ ๋ ์ ์๋ค.
let possibleNumber = "123"
if let convertedNumber = Int(possibleNumber){
print("convertedNumber= \(convertedNumber)")
}else {
print("nope")
- ํญ์ฌ ์์๊ฐ์ ์ฝ๋๋ฅผ ํตํด optionalํ ๊ฒฝ์ฐ bindingํด์ฃผ๋ ๊ฒ์ด ์ข๋ค.
####Implicityly Unwrapped Optional
- pass
let(x,y) = (1,2)
- ์ด๊ธฐํ๋ฅผ ๋ฉํฐํ๋ก ํ ์ ์๋ค.
- -9 % 4 = > -1 ์ ๋ฐํํ๋ค
- tuple์ ๋น๊ต๋ ๋๊ฐ์ค ํ๋๋ง ๋ง์ผ๋ฉด true๋ฅผ ๋ฐํํ๋ค.
let defaultColorName = "red"
var userDefinedColorName: String?
var colorNametoSUer = userDefinedColorName ?? defaultColorName
- nilcoalscing operation(??)์ ์์ ์์ ์ ๊ฐ์ด ์ฌ์ฉ๋๋ค. nil์ผ๊ฒฝ์ฐ๋ฅผ ํ๋ณํด ๋ถ๊ธฐํด์ค๋ค.
var empty = ""
var anotherEmpty = String()
- ์์๊ฐ์ด ์ด๊ธฐํ ํ ์ ์๊ณ isEmpty ๋ก ๋น์ด์๋์ง ํ์ธ์ด ๊ฐ๋ฅํ๋ค.
###CollectionType
- 3๊ฐ์ง ์ฃผ์ํ ์ฝ๋์ ์ด ์๋ค.
- array,set,dictionary์ด๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก ์ฝ๋ ์ ์ mutableํ๋ค.
#####array
- Int ๋ก ์ด๊ธฐํํ๋ค.
- ์ด์ ์์ array๋ Int๊ฐ ๋ค์ด๊ฐ๊ฒ์ด๋ผ ์๊ฐ๋์ด์ง๋ค.
- [] ๋ก ์ ์ธํ์ฌ ๋ค์ ์ด๊ธฐํ ํ ์์๋ค.
var threeDoubles = Array(repeating:0.0,count:3)
-
repeat,count ์ด๊ธฐํ๋ก ์ฐ์์ ์ด๊ธฐํ๊ฐ ๊ฐ๋ฅํ๋ค
-
array ๋ผ๋ฆฌ์ + ์ฐ์ฐ์ ๋ ์ด๋ ์ด๋ฅผ ์ด์ด์ ์ฐ๊ฒฐํด์ค๋ค. (์์๋ผ๋ฆฌ ๋ํ๋๊ฒ์ ์๋๋ค)
-
bracket์ ํตํด ์ด๊ธฐํํ ์ ์๋ค
var shppoingListWithBrackets: [String] = ["saousage","carrot"]
- swift๋ ๋๋ํด์
var shoppingList = ["eggs","milk"]
- ์๊ฐ์ด ํ์ฌ๋ ๋๊ฐ์ ํ์ ์ ๋ณด๊ณ String์ด๋ผ๊ณ ์ถ๋ก ํ๋ค.
- count,isEmpty๊ฐ์ ํจ์๋ค์ ๋ด์ฅํ๋ค.
shoppingList += ["pizza","banan"]
- += ๋ ๋ค์ ๋ฆฌ์คํธ๋ฅผ ์ถ๊ฐ๋ก ๋ถ์ฌ์ค๋ค.
- append ํจ์๋ฅผ ๋์ ํ์ฌ ์ธ ์ ์๋ค.
shoppingList[4...6] = ["a","b","c"]
- ์์๊ฐ์ด ๋ฒ์๋ก ํ๋ฐฉ์ ๋ฐ๊ฟ ์ ์๋ค.
- insert,remove๋ฑ ๋ค์ํ ํจ์ ์กด์ฌ.
for (index,value) in shoppingList.enumerated() {
print("index = \(index) value =\(value)")
}
- enumberated๋ฅผ ํตํด ๋ฐ๋ณต๋ฌธ์ ์ธ ์ ์๋ค.
####Set
- (hashble)๋ชจ๋ swift์ ๊ธฐ๋ณธํ์ (String,Int..) ๋ ํด์๋ธ์ด ๋ํดํธ์ด๋ค. ๊ทธ๋์ ๋ฒจ๋ฅ๋ ํค๊ฐ์ผ๋ก ์ด์ฉ๋ ์ ์๋ค.
var letters = Set<Character>()
var favoriteGenres: Set<String> = ["Rock","Classic","hiphop"]
- ์์ ๊ฐ์ด ์ด๊ธฐํ ํ ์ ์๋ค.
- ๊ทธ๋ฌ๋. swift๋ ํ์ ์ ์ถ๋ก ํจ์ผ๋ก
var favoriteGenress: Set = ["Rock","clasic"]
- ์ด๋ ๊ฒ ์ธ ์๋ ์๋ค.
- insert,count,isEmpty๋ฑ์ ํจ์๊ฐ ์ง์๋๋ค.
- ๊ทธ์ธ์ set์ ํน์ฑ์๊ฐ์ง union,insersection,substracting,symmetricDifference๋ฑ์ด ์ ๊ณต๋๋ค.
####Dictionary
- ๊ฐ value๋ ๊ณ ์ ์ key์ ๋งตํ๋๋ค.
var numberOfIntegers = [Int:String]()
numberOfIntegers[10] = "hi"
- ์์๊ฐ์ด ์ด๊ธฐํํ๊ณ ์ ๋ ฅํ๋ค.
var airports: [String: String] = ["aaa":"asiana","bbb":"koreanAir"]
- ๋น์ฐ ํคํ์ด๋ก ๋ฆฌํฐ๋ดํ๊ฒ์ฌ์ฉ๊ฐ๋ฅ.
var airports = ["aaa":"asiana","bbb":"koreanAir"]
- ์ด๋ ์ด,์ ๊ณผ๋ง์ฐฌ๊ฐ์ง๋ก ์์๊ฐ์ด ์ ๋ ฅํ ์ ์๋ค. ๋ชจ๋ ๊ฐ์ ํ์ ์ด๊ธฐ์ ๊ฐ๋ฅํ๊ฒ์ด๋ค.
for (portCode,portName) in airports {
print(portCode)
print(portName)
}
- ์์๊ฐ์ด ํฌ๋ฃจํ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
for portCode in airports.keys{
print(portCode)
}
for portCode in airports.values{
print(portCode)
}
- ํค์ ๋ฒจ๋ฅ๋ ์์ฝ๊ฒ ์ถ์ถ๊ฐ๋ฅํ๋ค
let airportCode = [String](airports.keys)
- ํค๊ฐ๋ง, ๋ฒจ๋ฅ๊ฐ๋ง arr๋ก ์ถ์ถํ ์ ์๋ค.
####Function
- func์ด๋ ํค์๋๋ฅผ ์์ ๋ฌ์ ์ฌ์ฉ ํ ์ ์๋ค.
- ๋ฆฌํด ํ์ ์ -> ๋ฅผ ํตํด ์ ํด์ค๋ค.
- ํจ์ ๊ธฐ์ ๋ฐฉ์์ด๋ค๋ฅด์ง ์ฌ์ฉํ๋ฐฉ๋ฒ์ ์ผ๋ฐ์ธ์ด์ ํฌ๊ฒ ๋ค๋ฅด์ง ์๋ค.
func returnMultiple(array: [Int]) -> (first: Int,second: Int){
return (array[0],array[1])
}
var array = [1,2,3,]
returnMultiple(array: array).0
- ๋ค๋ง ํน์ดํ๊ฒ ๋ฆฌํด์ ์ฌ๋ฌ๊ฐ ๋ฐ์ ์ ์๋ค.
- ํจ์์์ nil์ด ๋จ์ด์ง ์ ์์๊ฒฝ์ฐ ๋ฆฌํด๊ฐ์ ? ๋ฅผ๋ถ์ฌ ์ต์ ๋์ผ์์๋ค๋ ๊ฒ์ ๋ช ์ํด์ฃผ๊ณ ์ฒ๋ฆฌํด์ค์ผํ๋ค.
func ssum(a first: Int, b sec: Int) -> Int
- ์์๊ฐ์ด ํจ์ํธ์ถ์ ํ๋ผ๋ฏธํฐ๋ช ๊ณผ ์ค์ ํจ์๋ด๋ถ์์ ์ฐ๋ ํ๋ผ๋ฏธํฐ๋ฅผ ์ค์ ํด ์ค ์ ์๋ค.
- ์ฒ์ ํ๋ผ๋ฏธํฐ๋ _ ๋ฅผ ์ด์ฉํ์ฌ ์ ๋ฐ์ ์ ์๋ค.
func ssum(_ first: Int, b sec: Int = 12) -> Int {
- default value๋ฅผ ์ค์ ํ ์ ์๋ค.๊ฐ์ด ์์ ๊ฒฝ์ฐ default๊ฐ์ด ๋ค์ด๊ฐ๋ค.
func sumsArray(_ numbers: Int ...) -> Int
print(sumsArray(1,2,3,4,5))
- variable์ ... ์ผ๋ก ์์ฐจ๋๋ก ๋ฐฐ์ด๋ก ๋ฐ๊ณ ์ด๋ฅผ array์ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค.
- ํจ์ํ์ ์ด๋, ํจ์ ํ๋ผ๋ฏธํฐ, ๊ทธ๋ฆฌ๊ณ ๋ฆฌํด๊ฐ์ ๋ํ ํ์ ๊ฐฏ์์ ๊ดํ ์ด์ผ๊ธฐ๋ค.
func addTwoInts(_ a: Int, _ b: Int) -> Int
func multiplyTwoInts(_ a: Int, _ b: Int) -> Int
- ์์ ๋ํจ์์ ํจ์ํ์ ์ 2๊ฐ์ Int๋ฅผ ํ๋ฆฌ๋ฏธํฐ๋ก ๋ฐ๊ณ Intํ์ ์ผ๋ก ๋ฆฌํดํจ์ ์๋ฏธํ๋ค.
var mathFunction: (Int,Int) -> Int = addTwoInts
- mathFunction์ ์ธํธ๋๊ฐ๋ฅผ ํ๋ผ๋ฏธํฐ๋ก๋ฐ๊ณ ์ธํธ๋ฅผ ๋ฆฌํดํ๋ค๋ ํ์ ์ ๊ฐ์ง๊ณ addTowIntsํจ์๋ฅผ ๋ถ๋ฅธ๋ค ๋๊ฒ์ ์๋ฏธํ๋ค.
- ์ฝ๊ฒ ํจ์์ ํ์ ์ ์ผ๋ฐ Int,String๊ณผ ๊ฐ์ด ์ ์ธํ๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค.
print("\(mathFunction(2,3))")
- ์์๊ฒฐ๊ณผ๋ 2+3 ์ธ 5๊ฐ ๋์ค๊ฒ๋๋ค.
mathFunction = multiplyTwoInts
-
์์ ๊ฐ์ด ์ ์ธํ๋ฉด ํด๋น variable(mathFunction)์ด 2*3 6์ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅ๋๊ฒ๋๋ค.
-
์ด functionType์ ํจ์์ ํ๋ผ๋ฏธํฐ๋ก ์ฌ์ฉ๋ ์ ์๋ค.
func printMathResult(_ mathFunction: (Int, Int) -> Int, _ a: Int, _ b : Int) {
print("result => \(mathFunction(a,b))")
}
printMathResult(mathFunction, 5, 3)
-
(Int,Int) -> Int ํ์ ์ ๋ณ์๊ฐ ์ฒซ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ก ๋ค์ด๊ฐ๋ฉด ๋๋ค.
-
๊ทธ๋ฆฌ๊ณ ํจ์ ๋ด๋ถ์์ ํด๋น ํ์ ์ ๊ฐ์ง ํจ์์ ๊ฐ์ ์ฝ ํ๋ค.
-
์์์ ์ฐ๋ฆฌ๊ฐ mathFunction์ multiplyTwoInts๋ผ๊ณ ์ ์ธํ์์์ผ๋ก ํด๋น ํจ์๊ฐ ์ฝ๋์ด 5*3 ์ธ 15์ ๊ฐ์ด ์ถ๋ ฅ๋๊ฒ๋๋ค.
-
ํจ์ํ์ ์ ๋ฆฌํด ํ์ ์๋ ์ฌ์ฉ๋ ์ ์๋ค.
var currentValue = 3
func stepForward(_ input:Int) -> Int {
return input + 1
}
func stepBackward(_ input:Int) -> Int {
return input - 1
}
func choseStepFucntion(backword: Bool) -> (Int) -> Int {
return backword ? stepBackward : stepForward
}
var currentValue = 3
//ํ์ฌ๊ฐ์ด 0๋ณด๋ค ํด๊ฒฝ์ฐ true๊ฐ ๋จ์ stepBackword๋ฅผ ํธ์ถํ๊ณ input+1์ ํ๊ณ ํด๋น int๋ฅผ ๋ฆฌํด ํ๋ค
let MoveNearerTozer = choseStepFucntion(backword: currentValue > 0 )
print(MoveNearerTozer(3))
-
chooseStepFucntion์ ํ๋ผ๋ฏธํฐ์ ๋ฆฌํด๊ฐ๋ค์ ์ฒซ๋ฒ์งธ๋ก ๋ถ๋ฆฌ์ธ๊ฐ์ ํ๋ผ๋ฏธํฐ๋ก๊ฐ์ง๊ณ ๋๋ฒ์งธ๋ก steopbackward,stepForward์ ๋ค์ด๊ฐ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ๊ฒ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ์ฅ ๋ง์ง๋ง ์ต์ข ๋ฆฌํด๋ ํ์ ์ ๋ํ๋ธ๋ค.
-
์ผ๋จ MoveNearerTozer๋ ์ค๊ฐ stepBackword,steopForward ํ๋ผ๋ฏธํฐ๊ฐ์ ์ ์ธํ๊ณ ์ต์ด choseTepFunction์์ ์ฌ์ฉ๋ backword๋ง์ ๋ฐ์ ์กฐ๊ฑด๋ง์ ์ ํด์ค๋ค. ์ฌ๊ธฐ์๋ currentVlaue๊ฐ์ด 0๋ณด๋ค ํฌ๋? ๋ฅผ ๋ถ๋ฆฌ์ธ์ผ๋ก ๋๊ฒจ์ฃผ๊ฒ๋๋ค.
-
์ดํ MoveNearerTozer๋ฅผ ํธ์ถํ ๊ฒฝ์ฐ stepBackwarod or step Forward์ ํ๋ผ๋ฏธํฐ๋ก ๋ค์ด๊ฐ ๊ฐ์ ๋ฃ์ด์ค๋ค.
-
๊ทธ๋ ๊ฒ๋๋ฉด
- ์์ currentVlaue๊ฐ์ ๋น๊ต๋ฅผ ํตํด stepBackword, stepForward์ด๋ ํจ์๋ก ๊ฐ์ง ์ ํด์ง๊ณ
- MoveNearerTozer(3)์ 3์๊ฐ์ด ์ ํด์ง ํจ์(stepBackword or stepForward)๋ก ๋์ด๊ฐ๊ฒ๋๊ณ
- ํด๋น ํจ์์์์ ๋ฆฌํด๊ฐ์ ๋ค์ ๋ฐํํ๊ฒ ๋๋ ๊ฒ์ด๋ค.
-
ํ์ฌ์ํฉ์์ currentVlaue๊ฐ 3์ด๊ณ 0๋ณด๋ค ํผ์ผ๋ก true ์ด๋ฉฐ
-
stepBackward๋ฅผ ํธ์ถํ๊ณ ํ๋ผ๋ฏธํฐ์(input)์ 3์ด ๋ค์ด๊ฐ๊ฒ๋์ด 3-1 ์ด ๋ฆฌํด๋์ด ์ต์ข 2์๊ฐ์ด MoveNearerTozer ๋ฐํ๋์ด์ง๋ค.