- Quick demo of mutationg
- protocols
- String
- NSAttributedString
- Closures (and functions as type in general)
value type์์๋ copy on write (์ฐ๊ธฐ ์ ๋ณต์ฌ) ๊ฐ ์ผ์ด๋๊ธฐ ๋๋ฌธ์ ์ธ์ ๋ฐ๋๋ ์์ ์ ํ๋์ง ์์์ผ ๋ฏธ๋ฆฌ ์ฌ๋ณธ์ ๋ง๋ค์ด ๋ ์ ์์ต๋๋ค.
value type์ ํ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋์ง ์๊ณ ์ฌ์ฉํ ๋๋ง๋ค ๋งค๋ฒ ๋ณต์ฌํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ๋นํจ์จ์ ์ด๋ค. ํ์ง๋ง Swift์์๋ ๋ด์ฉ์ด ๋ณ๊ฒฝ๋์์ ๋๋ง ๋ณต์ฌํฉ๋๋ค. ์ด๊ฒ์ copy on write ์ฐ๊ธฐ ์ ๋ณต์ฌ
๋ผ๊ณ ํฉ๋๋ค. ์ด๊ฒ ๋ฐ๋ก ๊ตฌ์กฐ์ฒด์ ๋ค๋ฅธ ์ ์ธ๋ฐ, class๋ ์ด๊ฒ ์๋ค. ์ฌ๋ฌ ๊ณณ์ผ๋ก ์ ๋ฌ๋ ๋ ํฌ์ธํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋๋ค.
protocl ์ swift ์๋ฃ๊ตฌ์กฐ์ ํต์ฌ์ ์ค ํ๋์ด๋ค.
protocol ์์ฒด๋ ๊ฐ๋จํ๋ค. ๊ทธ์ ๋ณ๋์ ๊ตฌํ์ด ์๋ ๋ณ์์ ๋ฉ์๋์ ๋ฆฌ์คํธ์ด๋ค.
ํ์ง๋ง ๊ทธ ์ฉ๋๊ฐ ๋งค์ฐ ์ค์ํ๋ค.
Protocol์ ์ ์กด์ฌํ ๊น?
Protocol์ ๋ฌด์์ผ๊น?
protocol์ API์์ ์ํ๋ ๊ฒ์ ๋ถ๋ฌ์ค๋ ๋ฐฉ์์ ๋๋ค. ์ด๋ค struct, class, enum ์๊ด์์ด ์ด๋ค ๊ฒ์ด๋ ์ ๋ฌํ ์ ์๋ค.
ํ๋กํ ์ฝ์ API๋ฅผ ๋งค์ฐ ์ ์ฐํ๊ณ ๋ ์ ์ดํดํ ์ ์๋๋ก ๋ง๋ค์ด์ค๋๋ค. Blind ์ปค๋ฎค๋์ผ์ด์
๊ตฌ์กฐ์ ๋งค์ฐ ํจ๊ณผ์ ์
๋๋ค. MVC์์ View์ Controller ๊ฐ์ ์ปค๋ฎค๋์ผ์ด์
์์ will, did, should, data at, count ๋ฑ์ด ๋ชจ๋ blind
์ํ์ฌ์ผ ํฉ๋๋ค. ์๋ํ๋ฉด View๋ ๋งค์ฐ ์ผ๋ฐ์ ์ธ ๋ฐ๋ฉด Controller๋ ๊ตฌ์ฒด์ ์
๋๋ค. ํ๋กํ ์ฝ์ด ์ด๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๊ณ ๊ถํ์ ์ฃผ๋๋ฐ ์ ์ฉํฉ๋๋ค.
์๋ฅผ ๋ค์ด, Dictionary์์ ๋์ ๋๋ฆฌ๋ ํด์ ํ ์ด๋ธ์ ๋๋ค.
swift์์ protocol์ ๋ชจ๋ ๋ฉ์๋๊ฐ ํ์์ ์ผ๋ก ๊ตฌํ๋์ด์ผ ํ๋ค.
ํ์ง๋ง objective-c์์๋ ๊ทธ๋ ์ง ์๋ค. objective-c์์๋ ํ๋กํ ์ฝ์ ๋ฉ์๋ ๊ตฌํ์ด ์ ํ์ ์ด๋ค.
swift์์ ์์ @objc
๋ฅผ ๋ถ์ฌ์ฃผ๋ฉด objective-c ํ๋กํ ์ฝ์ฒ๋ผ ์ฌ์ฉํ ์๊ฐ ์๋ค. @objc ๋ objective-c๋ฅผ ์ด์ฉํด์ ๋์์ธ ๋์์ ๋๋ง ์ฌ์ฉํ๋ค. view์ controller์ ๋ธ๋ผ์ธ๋ ๊ด๊ณ์์ delegate๊ฐ objective-c์ ํ๋กํ ์ฝ์ ์ฌ์ฉํ๋ค.
protocol์ protocol์ ์์๋ฐ์ ์ ์๋๋ฐ ์์๋ฐ์ protocol์ ๋ฉ์๋๋ฅผ ๋ชจ๋ ๊ตฌํํด์ผ ํ๋ค๋ ์๋ฏธ์ด๋ค.
์์ ์ ์ธ์ด๊ธฐ ๋๋ฌธ์ ๊ตฌํ ์ฝ๋๋ ์๊ณ ๋ณ์๋ get set ์์ฑ์ ์ ํด์ฃผ์ด์ผ ํ๋ค.
์ด ํ๋กํ ์ฝ์ด ๊ตฌ์กฐ์ฒด์์ ์ ์๋์๋๋ฐ, ์์ ๋์ด์ผ ํ๋ค๋ฉด mutating
์ ๋ถ์ฌ์ค์ผ ํ๋ค.
๋ง์ฝ ํ์คํ ๊ตฌ์กฐ์ฒด์์ ์ ์๋์ง ์๋ protocol์ด๋ผ๋ฉด : class
๋ฅผ ๋ถ์ฌ์ ๋ช
์ํด์ค์ผ ํ๋ค.
protocol SomeProtocol: InheritedProtocol1, InheritiedProtocol2 {
var someProperty: Int { get set }
func aMethod(arg1: Double, anotherAgrument: String) -> SomeType
mutating func changeIt() // ๊ตฌ์กฐ์ฒด์์ ์ ์๋๊ณ ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ด ์์ ๋
init(arg: Type)
}
// struct์์๋ ์ ์๋ ์ ์๋ ๋
์์ด๋ผ๊ณ ๋ช
์ํด์ค.
protocol SomeProtocol: class, InheritedProtocol1, InheritiedProtocol2 {
var someProperty: Int { get set }
func aMethod(arg1: Double, anotherAgrument: String) -> SomeType
func changeIt() // : class ๋ฅผ ์ฌ์ฉํด ๊ตฌ์กฐ์ฒด์์ ์ ์๋์ง ์๋๋ค๊ณ ๋ช
์ํด์คฌ๊ธฐ ๋๋ฌธ์ mutating ์ ๊ฑฐ
init(arg: Type)
}
struct SomeStruct: SomeProtocol, AnotherProtocol {
// SomeProtocol ๊ตฌํ
// SomeProtocol, AnotherProtocol์ ๋ด์ฉ์ ๋ชจ๋ ๊ตฌํํด์ผ ํ๋ค.
}
์ ์์์ :
๋ค์ ์ํ๋ protocol์ ๋ถ์ฌ์ค์ผ๋ก์จ ์ฌ์ฉํ ์ ์๋๋ฐ, ๋น์ฐํ protocol์ ๋ด์ฉ์ ๋ชจ๋ ๊ตฌํํด์ค์ผ ํ๊ณ , Protocol์ ๋ช ๊ฐ๋ ์๊ด์๋ค. ์ด๊ฒ protocol์ด ๋ค์ค ์์์ ์ง์ํ๋ค๋ ์๋ฏธ์ด๋ค.
๋ง์ฝ protocol ๋ด์ init์ด ์๊ณ ํด๋์ค๋ก ๊ตฌํ๋๋ ค๊ณ ํ๋ค๋ฉด, required
ํ์๊ฐ ๋์ด์์ด์ผ ํ๋ค. ์๋ํ๋ฉด ์๋ธ ํด๋์ค๊ฐ ๋ฐ๋ผ์ค๋ ๊ฒ์ ์์น ์๊ธฐ ๋๋ฌธ์ด๋ค. ์๋ธ ํด๋์ค๊ฐ init์ ๋ฐ์์ ๋ ์ด์ ์ํผํด๋์ค์์ init์ด ์๋ํ์ง ์์ ์ ์๋ค. ์๋ธํด๋์ค์์ ๊ทธ๋ ๊ฒ ํ๊ธฐ๋ฅผ ์์น ์๋ ์ด์ ๋, ๊ทธ ์๋ธ ํด๋์ค๋ ๋ ์ด์ ์ด ํ๋กํ ์ฝ์ ๊ตฌํํ์ง ์์ง๋ง ์์๋ฐ์๊ธฐ ๋๋ฌธ์ ๋๋๊ฑธ๋ก ์๊ฐํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
ํด๋์ค๋ ๊ตฌ์กฐ์ฒด์์ extension์ ์ฌ์ฉํด protocol์ ๊ตฌํํด์ค ์๋ ์๋ค.
์ฝ๋๋ฅผ ์ ๋ฆฌํ๊ฑฐ๋ ํ๋กํ ์ฝ ์์ฒด๋ฅผ ๊ตฌํํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค. ๋ฌถ์ด ๋์ผ๋ฉด ๋ณด๊ธฐ์ข์์ ๐
extension Something: SomeProtocol {
// protocol ๊ตฌํ
// stored properties๋ ์ฌ์ฉํ ์ ์๋ค.
}
protocol Moveable {
mutating func move(to point: CGPoint)
}
class Car: Moveable {
mutating func move(to point: CGPoint) { ... }
func changeOil()
}
struct Shape: Moveable {
mutating func move(to point: CGPoint) { ... }
func draw()
}
let prius: Car = Car()
let square: Shape = Shape()
protocol ์ด๋ฐ ์์ผ๋ก ์ ์ํด์ ์ฌ์ฉํ ์ ์๋ค.
์ด์ ์ฌ๊ธฐ์ ์์ง์ผ ์ ์๋ Moveable ๋ณ์๋ฅผ ์ถ๊ฐํด๋ณด์. prius๋ Moveable ํ์ ์ ์์๋ฐ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋น์ฐํ prius๋ฅผ ํ ๋นํ ์ ์๋ค. ํ์ง๋ง ์ด๋ ๊ฒ ํ๋ฉด thingToMove.move ๋ ๊ฐ๋ฅํ์ง๋ง, thingToMove.changeOil์ ์ฌ์ฉํ ์ ์๋ค. Moveable ํ์ ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ฆฌ๊ณ thingToMove์๋ prius์ ๋ง์ฐฌ๊ฐ์ง๋ก Moveable์ ์์๋ฐ์ square๋ ํ ๋นํด์ค ์๊ฐ ์๋ค. thingsToMove: [Moveable] ๋ผ๋ Moveable ๋ฐฐ์ด๋ก ์์ ํ ๋ค๋ฅธ ๋์ ๊ฐ์ ๋ฐฐ์ด์ ๋ ์๋ ์๋ค.
...
var thingToMove: Moveable: prius
thingToMove.move(to: ...) // Ok
thingToMove.changeOil() // Error!
thingToMove = square
let thingsToMove: [Moveable] = [prius, square]
Moveable ํ์ ์ slider๋ฅผ ๋ฐ์์ move๋ฅผ ์คํํ๋ slide(slider:) ํจ์๋ ๋ง๋ค ์๊ฐ ์๋ค.
func slide(slider: Moveable) {
let positionToSlideTo = ...
slider.move(to: positiontoSlideTo)
}
slide(prius)
slide(square)
์ฌ๋ฌ ๊ฐ์ ํ๋กํ ์ฝ์ ๊ตฌํํด์ผ ํ๋ ์ธ์๋ฅผ ๋ฐ๋ ํจ์๋ฅผ ๊ฐ์ง ์๋ ์์ต๋๋ค.
func slipAndSlide(x: Slippery & Moveable)
slipAndSlide(prius) // Error!!, prius๋ Slippery๋ฅผ ์์๋ฐ๊ณ ์์ง ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ ์ ์๋ค.
protocols์ ์ค์ํ ์ฌ์ฉ ๋ฐฉ์ ์ค ํ๋๋ View์ Controller ์ฌ์ด์ blind communication์ ๊ตฌํํ๋ ๊ฒ์ ๋๋ค.
6๊ฐ์ง ๊ณผ์ ์ ๊ฑฐ์นฉ๋๋ค.
- ๋ทฐ๊ฐ Delegate protocol์ ์ ์ธํฉ๋๋ค. ์ฌ๊ธฐ์ will, did, should์ ๊ฐ์ด ๋ณด๋ด๊ณ ์ ํ๋ ๊ฒ์ด ๋ด๊ฒจ์์ต๋๋ค.
- ๋ทฐ์๋ public ๋ณ์๋ก delegation protocol์ธ weak delegate ๋ณ์๋ฅผ ๊ฐ๊ณ ์์ต๋๋ค.
- ๋ทฐ๊ฐ will, did, should์ ๊ฐ์ด ์ด๋ค ๊ฒ์ ๋ณด๋ด๊ณ ์ถ์ ๋ delegate ๋ณ์์ ๋ณด๋ ๋๋ค.
- ์ปจํธ๋กค๋ฌ๋ delegate protocol์ ๊ตฌํํ๊ฒ ๋ค๊ณ ์ ์ธํฉ๋๋ค.
- ๊ทธ๋ฆฌ๊ณ view์ delegate๋ฅผ ์๊ธฐ ์์ ์ผ๋ก ์ค์ ํฉ๋๋ค.
- ์ปจํธ๋กค๋ฌ๋ delegate protocol์ ๊ตฌํํฉ๋๋ค.
์ด์ ๋ทฐ์ ์ปจํธ๋กค๋ฌ๊ฐ ์ฎ์ด๊ฒ ๋์ง๋ง, ๋ทฐ์์ ์ฌ์ ํ ์ด๋์ ์ฌ์ฉ๋๋์ง ๋ชจ๋ฅธ์ฑ ๊ทธ์ delegate ๋ณ์์ ๋ณด๋ด๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
UIScrollView ์์ delegate ๋ณ์๋ฅผ ๊ฐ์ต๋๋ค.
weak var delegate: UIScrollViewDeleagte?
์ weak์ผ๊น์? ์ฌ๊ธฐ์ ๋ทฐ๋ ์ปจํธ๋กค๋ฌ๋ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ฅผ ๊ฐ๊ณ ์๊ณ ์ปจํธ๋กค๋ฌ๋ ๋ค๋ฅธ ์ฌ๋ฌ ๋ทฐ์ ์ฐ๊ฒฐ๋ ํฌ์ธํฐ๋ฅผ ๊ฐ๊ณ ์์ต๋๋ค. Heap ๋ฉ๋ชจ๋ฆฌ ์์์ ์ ์ง๋ ์ฑ ๋ง์ด์ฃ . View์์ ํ๊ณ ์ถ์ ์ผ์ ์์ ์ will, did, should๋ฅผ ๋ฐ๋ ๊ฒ์ ๊ฐ๋ฆฌํค๋ ์ผ์ ๋๋ค. ๋ง์ฝ ๊ทธ ๋์์ด heap์ ๋น ์ ธ๋๊ฐ๋ ค ํ๋ค๋ฉด, ๊ทธ๋ฅ ๊ทธ ๋์์ nil๋ก ๋ฐ๊พธ๊ณ ๋ ์ด์ ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ด์ง ์์ผ๋ฉด ๋ฉ๋๋ค. ์ด๋ ๊ฒ ๋ ์ด์ ๋ทฐ๋ ๊ฐ๋ฆฌํค๋ ๋์(controller)์ ํ ์์ ๋์ง ์๊ฒ ๋ฉ๋๋ค.
UIScrollViewDelegate ๋ ์ด๋ ๊ฒ ์๊ฒผ์ต๋๋ค.
@objc protocol UIScrollViewDelegate {
optional func scrollViewDidScroll(scrollView: UIScrollView)
optional func viewForZooming(in scrollView: UIScrollView) -> View
... and many more ...
}
ViewController์์๋ ์ด๋ ๊ฒ delegate๋ฅผ ์์ ์ผ๋ก ์ค์ ํฉ๋๋ค.
class MyViewController: UIViewController, UIScrollViewDelegate {
// @IBOutlet์ didSet ์์
scrollView.delegate = self
}
dictionary์ key๊ฐ ๋๊ธฐ ์ํด์๋ unique ํด์ผํฉ๋๋ค.
Hashable protocol์ uniqueํ hashValue Int(ํด์๊ฐ)๋ฅผ ์ ๊ณตํ๊ณ , Hashable์ ์์๋ฐ์ dictionary์ key๊ฐ ๋ ์ ์์ต๋๋ค.
protocol Hashable: Equatable {
var hashValue: Int { get }
}
์ฃผ๋ชฉํ ์ ์ Hashable์ Equatable protocol์ ์์๋ฐ๊ณ ์๋๋ฐ, Equatable์ ์์๋ฐ์์ผ๋ก์จ hashValue๊ฐ ๊ณ ์ ํ์ง ํ์ธํ ์ ์์ต๋๋ค.
Equatable์ ์๋์ ๊ฐ์ด ์๊ฒผ๊ณ ๋น๊ตํ๋ == ๋ฉ์๋ ํ๋๋ง์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ ์ ๋ฉ์๋๋ก ํ์
์ ์ง์ ๊ด์ฌํฉ๋๋ค. ํด์ ๊ฐ๋ฅํ์ง ํ์ธํ๊ธฐ ์ํด ์๋ ๋ฉ์๋๋ฅผ ๋จผ์ ๊ตฌํํด์ผ ํฉ๋๋ค. ํด์๋ฟ๋ง ์๋๋ผ ์ด๋ค ํด๋์ค์์๋ ์ด ํ๋กํ ์ฝ์ ์ฌ์ฉํ๋ค๋ฉด ==
๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
protocol Equatable {
static func ==(lhs: Self, rhs: Self) -> Bool
}
์ฆ, Dictionary์ key๋ Hashable ๊ตฌํ๋ฉ๋๋ค. Hashableํ๊ธฐ๋ง ํ๋ค๋ฉด ์ด๋ค ํ์ ์ด๋ key๊ฐ ๋ ์ ์์ต๋๋ค.
Dictionary<Key: Hashable, Value>
Concentration ๊ฒ์์์ emoji Dictionary์ key๋ก Int๋ฅผ ์ฌ์ฉํ์๋๋ฐ, ์์ ๋ฐฐ์ด ๊ฒ์ ํ์ฉํด Card๋ฅผ key๋ก ํด์ค ์ ์์ต๋๋ค. ๋ ์ด์ identifire๋ฅผ ๊ณต๊ฐํ์ง ์์๋ ๋ฉ๋๋ค.
struct Card: Hashable {
static func ==(lhs: Self, rhs: Self) -> Bool {
return lhs.identifire == rhs.identifire
}
private var identifier: Int
...
}
CountableRange (๊ณ์ ๊ฐ๋ฅ ๋ฒ์)
๋ ๋ง์ protocols๋ฅผ ๊ตฌํํฉ๋๋ค. ๊ทธ ์ค ๋ ๊ฐ์ง Seqeunce, Collection ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
Sequence
: makeIterator, ํ์ฌ ์์๊ฐ ์๊ณ ๋ค์์ด ์๋ ์๋ก ๋ค์ ์์๋ก ๋์ด๊ฐ๋ next ํจ์ ๋ง์ ๊ฐ๊ณ ์์ต๋๋ค. ์ด๊ฑธ๋ก for in
์ ๊ตฌํํ ์ ์์ต๋๋ค.
Collection
: subscripting ([ ]), index(offsetBy:), index(of:), etc ๊ฐ์ ๊ฒ๋ค์ด ์์ต๋๋ค.
์ ์ด๋ ๊ฒ ๋ง์ protocol์ด ํ์ํ ๊น์?
Array, Set, Dictionary, String ๋ฑ๋ฑ Apple์ ๋ง์ Generic ์ฝ๋๋ค์ด ๊ฐ์ ๊ฒ์ ๊ตฌํํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๋ ๊ฒ ํจ์ผ๋ก์จ ํ๋ก๊ทธ๋๋จธ๋ CountableRange๊ฐ ์์ด์ด๋ผ๋ ์ฌ์ค ํ๋๋ง ๋ฐฐ์ฐ๋ฉด ๋ฉ๋๋ค.
๋ฟ๋ง ์๋๋ผ ๊ธฐ๋ณธ ๊ตฌํ์ ์ ๊ณตํฉ๋๋ค. min(), max(), index, ๋ฑ๋ฑ ํ๋๋ง ๊ตฌํํด๋์ผ๋ฉด Array, Set, Dictionary ๋ฑ๋ฑ ์ฌ๋ฌ ๊ณณ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Swift์์ ์ ๊ณตํ๋ Generic, Value Type, var์ด๋ let๊ฐ์ ๋ถ๋ณ ๋ณ์ ์ ์ด, protocol์ ์ด์ฉํ ์ ์ฝ, protocol extension ๋ฑ์ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์ง์ํฉ๋๋ค. Swift์ ์ฅ์ ์ ๊ฐ์ฒด์งํฅ๊ณผ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ๋ชจ๋ ์ง์ํ๋ค๋ ์ ์ ๋๋ค.
String์ sequnce๊ฐ ์๋๋ผ ์ ๋์ฝ๋๋ก ์ด๋ฃจ์ด์ ธ์์ต๋๋ค. ์ ๋์ฝ๋๋ ๋ฐ์ดํธ ๋จ์์ ๋ฐ์ดํฐ๋ก ๊ฑฐ์ ๋ชจ๋ ์ธ์ด๋ฅผ ํํํ ์ ์์ต๋๋ค. String์์ Character๋ ๋จ์ํ ํ๋์ ์ ๋์ฝ์ ๊ฐ๋ ์ ์๋๋๋ค. ํ๋์ Character๋ ์ฌ๋ฌ ๊ฐ์ ์ ๋์ฝ๋์ผ ์๋ ์์ต๋๋ค.
์๋ฅผ๋ค์ด, cafe๋ c-a-f-รฉ ๋ก 4๊ฐ์ ์ ๋์ฝ๋์ผ ์๋ ์๊ณ c-a-f-e-' ๋ก 5๊ฐ์ผ ์๋ ์์ต๋๋ค. ์ด๋ ๊ธฐ ๋๋ฌธ์ String์ Int๋ก ์์ธํ์ง ์์ต๋๋ค. ๋์ String.Index
๋ผ๋ ํน๋ณํ ์์ธ์ ์ฌ์ฉํฉ๋๋ค.
์ด๋ฐ์์ผ๋ก ์ฌ์ฉํด๋ณผ ์ ์์ต๋๋ค.
var emojiChoices = "๐ฟ๐๐ป๐ญ๐ฌ๐"
...
let randomIndex = emojiChoices.index(emojiChoices.startIndex, offsetBy: emojiChoices.count.arc4random)
emoji[card] = String(emojiChoices.remove(at: randomIndex))
let attributes: [NSAttributedStringKey : Any]
let attributeText = NSAttributedString(string: "Flips: 0", attributes: attributes)
flipCountLabel.attributedText = attributeText
"function type"์ ๋ณ์๋ฅผ ์ ์ธํ ์ ์์ต๋๋ค. ํจ์์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฐ๋ ์ธ์์ ํ์ ๊ณผ ๋ฆฌํด ํ์ ์ ์ง์ ํด์ค ์ ์์ต๋๋ค.
var operation: (Double) -> (Double)
operation = sqrt
let result = operation(4.0) // result will be 2.0
closure๋ ์ธ๋ผ์ธ ํจ์์ ๋๋ค. ๋น์ฐํ ํจ์๋ฅผ ํด๋ก์ ๋ก ๋ง๋ค ์ ์์ต๋๋ค.
func changeSign(operand: Double) -> Double { return -operand }
var operation: (Double) -> (Double)
operation = chagneSign
let result = operation(4.0)
// closure
var operation: (Double) -> (Double)
operation = { (operand: Double) -> Double in return -operand }
let result = operation(4.0)
// return ํ์
์ด ์ถ๋ก ๊ฐ๋ฅ
var operation: (Double) -> (Double)
operation = { (operand: Double) in return -operand }
let result = operation(4.0)
// ํผ ์ฐ์ฐ์ ํ์
๋ ์ด๋ฏธ ์๊ณ ์์
var operation: (Double) -> (Double)
operation = { (operand) in return -operand }
let result = operation(4.0)
// ์ด๋ฏธ ์ด๋ค ๊ฒ์ ๋ฆฌํดํ๋ค๋ ๊ฑธ ์๊ณ ์์
var operation: (Double) -> (Double)
operation = { (operand) in -operand }
let result = operation(4.0)
// ์ธ์๋ ์ ์ด์ค ํ์๊ฐ ์๋ค.
// ์ฒซ๋ฒ์งธ ์์๋ฅผ 0์ผ๋ก $0, $1, $2 ...
var operation: (Double) -> (Double)
operation = { -$0 }
let result = operation(4.0)
ํจ์๋ ๋ฌด์์ ํ ์ง ์๋ ค์ฃผ๋ ์ข์ ๋ฐฉ๋ฒ์ด๋ค. ์ด๋ค ์ค๋ฅ๊ฐ ์์ ๋, ์ด๋ค ์์ ์ด ๋๋ฌ์ ๋ ํด์ผํ ์ผ ๋ฑ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ์์ ์ ํด๋ก์ ๋ก ๋๊ฒจ์ค์ ๊ทธ ์์ ์ด ํ์ํ ๋ ํจ์๋ฅผ ๋ถ๋ฌ์ ์ฌ์ฉํ ์ ์๋ค.
๋ ๋ฐ๋ณต์ ์ธ ์ผ์ ํ ๋ ์ฌ์ฉํ ์ ์๋ค. ์๋ฅผ ๋ค์ด, ๋ฐฐ์ด์ ๊ฐ์ ์์ ์ ํด์ฃผ๊ณ ์ถ๋ค๋ฉด map์ ์ฌ์ฉํด ํด๋ก์ ๋ฅผ ๋๊ฒจ ์์ ํด์ค ์ ์๋ค.
let primes = [2.0, 3.0, 5.0, 10.0]
let negativePrimes = primes.map { -$0 }
let invertedPrimes = primes.map { 1.0/$0 }
let primeStrings = primes.map { String($0) }
var someProperty: Type {
...
return Type
}()
lazy
์ ํจ๊ป ์ฌ์ฉํ๋ฉด ๋์ฑ ํจ๊ณผ์ ์
๋๋ค.
clousure๋ฅผ ์ฌ์ฉํ ๋ ์ฃผ์ํ ์ ์ ์ฃผ๋ณ ๋ณ์๋ฅผ ํฌ์ฐฉํ๋ค๋ ๊ฒ์ ๋๋ค. ํด๋ก์ ๋ static ๋ณ์๋ ์ฃผ๋ณ ์ง์ญ ๋ณ์ ๋ฑ ๋ค๋ฅธ ๋ณ์๋ฅผ ๋ฐ์ ์๊ฐ ์์ต๋๋ค. ์ด๋ ํด๋ก์ ๋ reference type ์ด๊ธฐ ๋๋ฌธ์ ๊ทธ ๋ณ์๋ค์ด ํ ๋ฉ๋ชจ๋ฆฌ์ ์กด์ฌํ๊ฒ ๋ฉ๋๋ค.
var ltuae = 42
operation = { ltuae * $0 }
arrayOfOperations.append(operation)
์ ์์ ์์ operation
ํด๋ก์ ์์์ ์ง์ญ๋ณ์ ltuae๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ operation์ arrayOfOperation
๋ฐฐ์ด์ ๋ค์ด๊ฐ๊ฒ ๋๋๋ฐ ltuae๋ฅผ ๋ชจ๋ฅด๋ฉด ์ฌ์ฉํ ์๊ฐ ์์ต๋๋ค. ๋ฐ๋ผ์ ltuae๋ ํ ๋ฉ๋ชจ๋ฆฌ์ ๋ค์ด๊ฐ๊ฒ ๋ฉ๋๋ค.