|
| 1 | +# ํ์
์บ์คํ
(Type Casting)๊ณผ ํ์ฅ(Extension) |
| 2 | + |
| 3 | +> ๐ก ํ์
์บ์คํ
์ ์ธ์คํด์ค ์ฌ์ฉ์์ ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ ์์ ํ๋ ๊ฒ์ด ์๋๋ผ ์ด๋ค ํ์
์ผ๋ก ์ฌ์ฉํ ์ง ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ์ ๋ํ ํํธ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ด๋ผ๊ณ ํ ์ ์๋ค. |
| 4 | +
|
| 5 | +<br> |
| 6 | + |
| 7 | +## is ์ฐ์ฐ์์ as ์ฐ์ฐ์ |
| 8 | + |
| 9 | +- `is` ์ฐ์ฐ์: ์ธ์คํด์ค ํ์
์ ๊ฒ์ฌ๋ฅผ ์ํํด์ฃผ๋ ์ฐ์ฐ์์ด๋ค. |
| 10 | + |
| 11 | +```swift |
| 12 | +// Person() -์์-> Student() -์์-> Undergraduate()๋ผ๊ณ ํ ๋ |
| 13 | + |
| 14 | +var person1 = Person() |
| 15 | +var student1 = Student() |
| 16 | + |
| 17 | +person1 is Person // true |
| 18 | +person1 is Student // false |
| 19 | + |
| 20 | +student1 is Person // true |
| 21 | +student1 is Student // true |
| 22 | +student1 is Undergraduate() // false |
| 23 | +``` |
| 24 | + |
| 25 | +`is` ์ฐ์ฐ์๋ ์ ์ฝ๋ ์ฒ๋ผ ํ์
์ ๋ํ ๊ฒ์ฌ๋ฅผ ์ํํ์ฌ ์ฐธ์ด๋ฉด `true` ๊ฑฐ์ง์ด๋ฉด `false`๋ฅผ ๋ฐํํ๋ค. |
| 26 | +(๋๋ฌด ๋น์ฐํ๊ฐ?ใ
ใ
) |
| 27 | + |
| 28 | +<br> |
| 29 | + |
| 30 | +- `as` ์ฐ์ฐ์: ์ธ์คํด์ค ํ์
์ ํํธ๋ฅผ ๋ณ๊ฒฝํด์ฃผ๋ ์ฐ์ฐ์์ด๋ค. |
| 31 | + |
| 32 | +```swift |
| 33 | +var person: Person = Undergraduate() |
| 34 | +person.id |
| 35 | +person.name |
| 36 | +person.email |
| 37 | +person.studentId // ์ ๊ทผ ๋ถ๊ฐ |
| 38 | +person.major // ์ ๊ทผ ๋ถ๊ฐ |
| 39 | + |
| 40 | +// ๋ฉ๋ชจ๋ฆฌ์ studentId์ major์ ๊ณต๊ฐ์ด ์์ง๋ง Person ํ์
์ด๋ผ๊ณ ์ธ์ํ๊ธฐ ๋๋ฌธ์ ์ค๋ฅ๊ฐ ๋๋ค. |
| 41 | + |
| 42 | +// person์ Undergraduate๋ก ๋ค์ด ์บ์คํ
, ๋ณดํต if let ๋ฐ์ธ๋ฉ๊ณผ ํจ๊ป ์ฌ์ฉํ๋ค. |
| 43 | +if let newPerson: Undergraduate? = person as? Undergraduate { |
| 44 | + newPerson.id |
| 45 | + newPerson.name |
| 46 | + newPerson.email |
| 47 | + newPerson.studentId |
| 48 | + newPerson.major |
| 49 | +} |
| 50 | + |
| 51 | +// ๊ฐ์ ๋ค์ด์บ์คํ
, ์คํจํ ๊ฒฝ์ฐ ๋ฐํ์ ์ค๋ฅ |
| 52 | +let ppb = person as! Undergraduate |
| 53 | +``` |
| 54 | + |
| 55 | +์
์บ์คํ
์์๋ ํญ์ ์ฑ๊ณตํ๊ธฐ ๋๋ฌธ์ `as`๋ง ์ฐ๋ฉด ๋์ง๋ง ์ ์ฝ๋ ์ฒ๋ผ ๋ค์ด์บ์คํ
์์๋ ์คํจ ๊ฐ๋ฅ์ฑ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ `as?` ๋ `as!`๋ฅผ ์ด๋ค. |
| 56 | + |
| 57 | +<br> |
| 58 | + |
| 59 | +## ํ์
๊ณผ ๋คํ์ฑ(Polymorphism) |
| 60 | + |
| 61 | + |
| 62 | +> ๐ก ๋คํ์ฑ์ ํ๋์ ๊ฐ์ฒด(์ธ์คํด์ค)๊ฐ ์ฌ๋ฌ๊ฐ์ง ํ์
์ ํํ๋ก ํํ๋ ์ ์์์ ์๋ฏธํ๋ค. ๋คํ์ฑ์ด ๊ตฌํ๋๋ ๊ฒ์ ํด๋์ค์ ์์๊ณผ ๊น์ ์ฐ๊ด์ด ์๋ค. |
| 63 | +
|
| 64 | +์์ง์ ์ด๋ ต๋ค.. ์ถํ์ ์ดํด ๋ํ๊ณ ๋ด์ฉ์ถ๊ฐ ์์ |
| 65 | + |
| 66 | +<br> |
| 67 | + |
| 68 | +## Any์ AnyObject |
| 69 | + |
| 70 | + |
| 71 | +- Anyํ์
: ๊ธฐ๋ณธํ์
์ ํฌํจํ ๋ชจ๋ ํ์
์ ์ธ์คํด์ค๋ ํํํ ์ ์๋ ํ์
์ด๋ค. |
| 72 | + |
| 73 | +```swift |
| 74 | +var some: Any = "Swift" |
| 75 | + |
| 76 | +some = 2 |
| 77 | +some = 3.2 |
| 78 | + |
| 79 | +(some as! String).count |
| 80 | +// ๋ฌธ์์ด์ด ๋ค์ด์์ง๋ง count๋ฅผ ์ฌ์ฉํ ์ ์๊ธฐ๋๋ฌธ์ String์์ ์๋ ค์ค๋ค. |
| 81 | + |
| 82 | +// Any๋ฅผ ์ฌ์ฉํ๋ฉด ์ต์
๋ํ์
์ ํฌํจํ ๋ชจ๋ ํ์
์ ๋ด์ ์ ์๋ ๋ฐฐ์ด์ด ์์ฑ ๊ฐ๋ฅํ๋ค. |
| 83 | +let array: [Any] = [5, "์๋
", Person(), {(name: String) in return name}] |
| 84 | +``` |
| 85 | + |
| 86 | +Anyํ์
์ ์ฌ์ฉํ๋ฉด ์ด๋ ํ ํ์
๋ ๋ฃ์ ์ ์์ง๋ง, ์ ์ฅ๋ ํ์
์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ ์ ์๊ธฐ ๋๋ฌธ์, ํญ์ ํ์
์บ์คํ
์ ํด์ ์ฌ์ฉํด์ผ ํ๋ค. |
| 87 | + |
| 88 | +<br> |
| 89 | + |
| 90 | +- AnyObject ํ์
: ์ด๋ค ํด๋์ค ํ์
์ ์ธ์คํด์ค๋ ํํํ ์ ์๋ ํ์
์ด๋ค. |
| 91 | + |
| 92 | +```swift |
| 93 | +let objArray: [AnyObject] = [Person(), Superman(), NSString()] |
| 94 | + |
| 95 | +(objArray[0] as! Person).name |
| 96 | +``` |
| 97 | + |
| 98 | +Anyํ์
๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ํ์
์บ์คํ
์ ํด์ ์ฌ์ฉํด์ผํ๋ค. |
| 99 | + |
| 100 | +<br> |
| 101 | + |
| 102 | +## ํ์
์ ํ์ฅ(Extension) |
| 103 | + |
| 104 | + |
| 105 | +- ์์ง ํ์ฅ(์์์ ์ด์ฉ) |
| 106 | +โ ๋น์ทํ ํ์
์ ์๋ก ๋ง๋ค์ด ๋ฐ์ดํฐ(์ ์ฅ์์ฑ)์ ์ถ๊ฐํ๊ฑฐ๋ ๋ฉ์๋๋ฅผ ๋ณํ์์ผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค. |
| 107 | +- ์ํ ํ์ฅ โ (extension ์ด์ฉ)ํ์ฌ ์กด์ฌํ๋ ํ์
์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ฌ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค. |
| 108 | +- ์ฌ์ ์๋ ์์์์๋ง ์ผ์ด๋๋ ๊ฒ์ ์ฃผ์ ํ์ |
| 109 | + |
| 110 | +```swift |
| 111 | +class SomeType { |
| 112 | + |
| 113 | +} |
| 114 | + |
| 115 | +extension SomeType { |
| 116 | + // ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐ ๊ฐ๋ฅ(๋ฉ์๋ ํํ๋ง ๊ฐ๋ฅ) |
| 117 | + func dosomething() { |
| 118 | + print("do something") |
| 119 | + } |
| 120 | +} |
| 121 | +``` |
| 122 | + |
| 123 | +ํ์
์ ํ์ฅ์ ์ด๊ฑฐํ, ํด๋์ค, ๊ตฌ์กฐ์ฒด ๋ชจ๋ ๊ฐ๋ฅํ๋ค. ๋ํ ์ค์ํํธ์์๋ ํ์ฅ์์ ๊ตฌํํ ๋ฉ์๋์ ๋ํ ์ฌ์ ์๋ ๋ถ๊ฐ๋ฅํ๋ค. (์์ `@objc`๋ฅผ ๋ถ์ด๋ฉด ๊ฐ๋ฅํจ) |
| 124 | + |
| 125 | +<br> |
| 126 | + |
| 127 | +- ์๊ธ-๋ชจ๋ธ๋ง: ํ์ฅ์ ์ฌ์ฉํ๋ฉด ์ ํ์์ ๋ง๋ค์ด๋ ๊ธฐ๋ณธํ์
์ ํ์ฅ์์ผ ์ธ ์ ์๋ค. |
| 128 | + |
| 129 | +```swift |
| 130 | +extension Int { |
| 131 | + var squared: Int { |
| 132 | + return self * self |
| 133 | + } |
| 134 | +} |
| 135 | + |
| 136 | +5.squared // 25 |
| 137 | +3.squared // 9 |
| 138 | +``` |
| 139 | + |
| 140 | +<br> |
| 141 | + |
| 142 | +- ํ์
/์ธ์คํด์ค ๊ณ์ฐ ์์ฑ์ ํ์ฅ |
| 143 | + |
| 144 | +```swift |
| 145 | +// ํ์
๊ณ์ฐ ์์ฑ์ ํ์ฅ |
| 146 | +extension Double { |
| 147 | + static var zero: Double { |
| 148 | + return 0.0 |
| 149 | + } |
| 150 | +} |
| 151 | + |
| 152 | +Double.zero // 0 |
| 153 | + |
| 154 | +// ์ธ์คํด์ค ๊ณ์ฐ ์์ฑ์ ํ์ฅ |
| 155 | +extension Double { |
| 156 | + var km: Double { |
| 157 | + return self * 1_000.0 |
| 158 | + } |
| 159 | + var cm: Double { |
| 160 | + return self / 100.0 |
| 161 | + } |
| 162 | +} |
| 163 | + |
| 164 | +10.0.km // 10000 |
| 165 | +``` |
| 166 | + |
| 167 | +<br> |
| 168 | + |
| 169 | +- ํ์
/์ธ์คํด์ค ๋ฉ์๋์ ํ์ฅ |
| 170 | + |
| 171 | +```swift |
| 172 | +Int.random(in: 1...100) |
| 173 | + |
| 174 | +extension Int { |
| 175 | + static func printNumbersFrom1to5() { |
| 176 | + for i in 1...5 { |
| 177 | + print(i) |
| 178 | + } |
| 179 | + } |
| 180 | +} |
| 181 | + |
| 182 | +Int.printNumbersFrom1to5() |
| 183 | + |
| 184 | +extension String { |
| 185 | + func printHello(of times: Int) { |
| 186 | + for _ in 0..<times { |
| 187 | + print("Hello \(self)") |
| 188 | + } |
| 189 | + } |
| 190 | +} |
| 191 | + |
| 192 | +"Steve".printHello(of: 5) |
| 193 | +``` |
| 194 | + |
| 195 | +๊ตฌ์กฐ์ฒด๋ ์ด๊ฑฐํ์์๋ `mutating`ํค์๋๋ฅผ ๋ถ์ฌ์ผ ํ๋ค. |
| 196 | + |
| 197 | +<br> |
| 198 | + |
| 199 | +- ํ์ฅ์์์ ํด๋์ค ์์ฑ์ โ ํธ์ ์์ฑ์๋ง ๊ฐ๋ฅํ๋ค! |
| 200 | + |
| 201 | +```swift |
| 202 | +extension UIColor { |
| 203 | + convenience init(color: CGFloat) { |
| 204 | + self.init(red: color/255, green: color/255, blue: color/255, alpha: 1) |
| 205 | + } |
| 206 | +} |
| 207 | +UIColor.init(color: 1) |
| 208 | +``` |
| 209 | + |
| 210 | +์ ์ฝ๋์ฒ๋ผ ์์ฃผ ์ฝ๊ฒ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณต ํ ์ ์๋ค. |
| 211 | + |
| 212 | +<br> |
| 213 | + |
| 214 | +- ํ์ฅ์์์ ๊ตฌ์กฐ์ฒด ์์ฑ์ โ ๊ตฌ์กฐ์ฒด์ ๊ฒฝ์ฐ ํธ์์์ฑ์๋ ์ง์ ์์ฑ์๋ ์๊ด์ด ์๋ค. |
| 215 | + |
| 216 | +```swift |
| 217 | +struct Point { |
| 218 | + var x = 0.0, y = 0.0 |
| 219 | + // ๋ฉค๋ฒ์์ด์ฆ ์ด๋์
๋ผ์ด์ ธ |
| 220 | +} |
| 221 | + |
| 222 | +extension Point { |
| 223 | + init(num: Double) { |
| 224 | + self.init(x: num, y: num) |
| 225 | + } |
| 226 | +} |
| 227 | +``` |
| 228 | + |
| 229 | +<br> |
| 230 | + |
| 231 | +- ์๋ธ ์คํฌ๋ฆฝํธ ํ์ฅ |
| 232 | + |
| 233 | +```swift |
| 234 | +extension Int { |
| 235 | + subscript(num: Int) -> Int { |
| 236 | + var decimalBase = 1 |
| 237 | + for _ in 0..<num { |
| 238 | + decimalBase *= 10 |
| 239 | + } |
| 240 | + return (self/decimalBase) % 10 |
| 241 | + } |
| 242 | +} |
| 243 | +123456789[0] // 9 |
| 244 | +123456789[1] // 8 |
| 245 | +``` |
| 246 | + |
| 247 | +<br> |
| 248 | + |
| 249 | +- ์ค์ฒฉ ํ์
: ํด๋์ค, ๊ตฌ์กฐ์ฒด ๋ฐ ์ด๊ฑฐํ์ ์ ์ค์ฒฉ ์ ํ์ ์ถ๊ฐ ๊ฐ๋ฅํ๋ค. |
| 250 | + |
| 251 | +```swift |
| 252 | +// ์ค์ฒฉ ํ์
|
| 253 | +class Day { |
| 254 | + enum Weekday { |
| 255 | + case mon |
| 256 | + case tue |
| 257 | + case wed |
| 258 | + } |
| 259 | + var day: Weekday = .mon |
| 260 | +} |
| 261 | +var ddd: Day.Weekday = Day.weekday.mon |
| 262 | + |
| 263 | +// ์ค์ฒฉํ์
์ ํ์ฅ |
| 264 | +extension Int { |
| 265 | + enum Kind { |
| 266 | + case negative, zero, positive |
| 267 | + } |
| 268 | + |
| 269 | + var kind: Kind { |
| 270 | + switch self { |
| 271 | + case 0: |
| 272 | + return Kind.zero |
| 273 | + case let x where x > 0: |
| 274 | + return Kind.positive |
| 275 | + default: |
| 276 | + return Kind.negative |
| 277 | + } |
| 278 | + } |
| 279 | +} |
| 280 | + |
| 281 | +let a = 1 |
| 282 | +a.kind // positive |
| 283 | +``` |
0 commit comments