๐ Programming/Swift
[Swift] .\self ? ํค๊ฒฝ๋ก ํบ์๋ณด๊ธฐ (KeyPath)
forEach์์ ์์ฃผ ์ฌ์ฉํ๋ .\self ๋ฌด์จ ์๋ฏธ์ผ๊น ? KeyPath ํค ๊ฒฝ๋ก๋ ํ๋กํผํฐ์ ๊ฐ์ ๋ฐ๋ก ๊ฐ์ ธ์ค์ง ์๊ณ ์ด๋ค ํ๋กํผํฐ์ ์์น๋ง ์ฐธ์กฐํ๋๋ก ํ ์ ์๋ค. ๊ธ๋ก๋ ์ค๋ช ํ๊ธฐ ์ด๋ ค์ด ๊ฐ๋ ์ธ๊ฒ ๊ฐ๋ค. ๋ฐ๋ก ์์ ๋ฅผ ๋ณด์ ! Swift๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ํจ์๊ฐ ์ผ๊ธ๊ฐ์ฒด์ ์ญํ ์ ํ ์ ์๋ค. ๋๋ฌด ์ ๋ช ํ ์์ ..์ธ๋ฐ ์ด๋ ๊ฒ ๋ณ์๋ก ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๊ณ , ์ฐธ์กฐ๋ฅผ ํ ๋นํ ์ ์์ต๋๋ค ! func someFunction(paramA: Any, paramB: Any){ print("SomeFunction called...") } var functionReference = someFunction(paramA:paramB:) functionReference("A","B") // someFuncti..
[Swfit] ํ๋กํผํฐ ๊ฐ์์ / property observer (willSet & didSet)
Property Observer ํ๋กํผํฐ ๊ฐ์ ๋ณํ๋ฅผ ๊ด์ฐฐํ๊ณ , ์ ์ฅ ํ๋กํผํฐ์ ์ถ๊ฐํ ์ ์๋ค. willSet, didSet์ผ๋ก ํ๋กํผํฐ์ ๊ฐ ๋ณํํ ๋ ํธ์ถ๋จ -> ๊ฐ์ ๋ณํ๋ฅผ ๋ชจ๋ํฐ๋ง ํ ์ ์๋ค. ๐ ์, ์ธ์ ์ฌ์ฉํ๋์ง ? ์ฃผ๋ก iOS๊ฐ๋ฐ์์ UI๋ฅผ ์ ๋ฐ์ดํธ ํ ๋ ์ฌ์ฉํฉ๋๋ค. willSet ๊ฐ์ด ์ ์ฅ๋๊ธฐ ์ง์ ์ ํธ์ถ๋ฉ๋๋ค. willSet์ ํ๋ผ๋ฏธํฐ๋ ๋ฐ๋๊ฒ ๋ ๋ณ์์ ๊ฐ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. var fruit : String = "apple" { willSet(newFruit){ print("๊ณผ์ผ์ด \(fruit)์์ \(newFruit)์ผ๋ก ๋ณ๊ฒฝ๋ฉ๋๋ค.") } } ํ๋ผ๋ฏธํฐ๋ฅผ ์ค์ ํ์ง ์์ ๊ฒฝ์ฐ newValue๋ก ์๋ ์ง์ ๋ฉ๋๋ค. var fruit : String = "apple" { will..
[Swift] ์ต์ ๋ ์ฒด์ด๋
๐ ์ต์ ๋ ์ฒด์ด๋ ์ต์ ๋ ์ฒด์ด๋์ ๊ตฌ์กฐ์ฒด๋, ํด๋์ค ์ต์ ๋์ ์ฌ์ฉํ๋๋ฐ ๊ทธ ์ต์ ๋์ด ๋ ์ต์ ๋์ ๊ฐ์ง ๋ ์ฆ, ์ฐ์์ ์ผ๋ก ์ต์ ๋์ ๊ฐ์ง๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ ์ ์๋ค. ์๋ฅผ๋ค์ด ์๋์ ๊ฐ์ ํด๋์ค๊ฐ ์๋ค๊ณ ํ์. // ๊ฐ์ธ์ ๋ณด class Person { var name : String var age : Int var phone : Phone? init(name : String, age : Int){ self.name = name self.age = age } } // ํฐ์ ๋ณด class Phone { var number : String var type : Kind? init(number : String){ self.number = number } } // ํฐ์ข ๋ฅ class Kind { var brand : St..
[Swift] class ์์(Inheritance)
์์์ ์ค๋ก์ง 'ํด๋์ค' ์์๋ง ๊ฐ๋ฅํ๋ค. swift์์ ์์์ ํ ๋ฒ๋ง ๊ฐ๋ฅํ๋ค. (== ๋จ์ผ์์) ๐ ๊ธฐ๋ณธ๊ตฌํ class Name : ์์๋ฐ์class { // code } ๐ ์์ ์์์ ์์ ๋ฅผ ์์ธ์ ์ค๋ช ํด๋ณด๋ฉด, ์ด๋ฆ๊ณผ ๋์ด๋ฅผ ํ๋กํผํฐ๋ก ๊ฐ์ง๊ณ , ๊ทธ ๊ฐ์ ์ถ๋ ฅํ๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง๋ ํด๋์ค๋ ๋ค์๊ณผ ๊ฐ๋ค. class Info { var name = "" var age = "" func print_name() { print("๋ด ์ด๋ฆ์ \(name) ์ ๋๋ค.") } func print_age() { print("๋๋ \(age)์ด ์ ๋๋ค.") } } ์ ํด๋์ค์ ์ ๋ณด๋ฅผ ๋ชจ๋ ๊ฐ์ง๋ฉด์ ์ธ๊ตญ์ด๋ก๋ ์ถ๋ ฅํ ์ ์๊ฒ ํ๊ณ ์ถ๋ค๋ฉด ์์์ ์ด์ฉํ ์ ์๋ค. ์ฆ, ์์์ด๋ ๋ค๋ฅธ ํด๋์ค์ ์ ๋ณด๋ฅผ ๋ชจ๋ ๊ฐ์ง๋ ๊ฒ์ ์๋ฏธ..
[Swift] property(ํ๋กํผํฐ)
ํด๋น ํฌ์คํ ์ ์๋ ๋งํฌ์์ ๊ฐํ์ & ์ฐธ์กฐํ์ ์ ๋จผ์ ํ์ตํ ํ์ ์ฝ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค. https://990427.tistory.com/71 ์ ๊ฒ์๋ฌผ๋ค์์ ํด๋์ค๋ ๊ตฌ์กฐ์ฒด์ ์ฐ๋ ๋ณ์๋ ์์๋ฅผ ํ๋กํผํฐ๋ผ๊ณ ๋ถ๋ ์๋ค. ํ๋กํผํฐ๋ ํด๋์ค, ๊ตฌ์กฐ์ฒด, ์ด๊ฑฐํ์ ๊ด๋ จ๋ ๊ฐ์ ๋ปํ๋ค. (๋์ถฉ ์์๋ง๋ ๋ง์) ํ๋กํผํฐ๋ ์ด 3๊ฐ์ง ํํ๋ก ์กด์ฌํ๋๋ฐ, ํ๋์ฉ ์์๋ณด๋๋ก ํ์. Stored Property (์ ์ฅ ํ๋กํผํฐ) ์ ์ฅ ํ๋กํผํฐ๋ ๋ง ๊ทธ๋๋ก ๊ฐ์ ์ ์ฅํ๋ ํ๋กํผํฐ๋ฅผ ์๋ฏธํ๋ค. ์ฐ๋ฆฌ๊ฐ ์ตํ ์๊ณ ์๋ class, struct์์ ์กด์ฌํ๋ ๋ณ์๋ ์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ฅ ํ๋กํผํฐ์ด๋ค. class ex1 { let num = 0 var str = "hello" } struct ex2 { var num = 1 let..
[Swift] ํด๋ก์ (Closure)์ ๋ชจ๋ ๊ฒ
๋ณธ ๊ฒ์๋ฌผ์ ํด๋ก์ ์ ๊ธฐ๋ณธ ๋ถํฐ ์ฌํ๊น์ง ๋ชจ๋ ๋ค๋ฃจ๊ณ ์์ต๋๋ค. swift ํจ์์ ๊ธฐ๋ณธ์ ๋ค๋ฃจ์๋ค๊ณ ๊ฐ์ ํ๊ณ ์์ฑํ์ต๋๋ค. Closure / ํด๋ก์ ํด๋ก์ ๋? ๋ณดํต์ ์ต๋ช ํจ์๋ฅผ ๋ปํ๋ค. ํ์ง๋ง named ํจ์๋ ํด๋ก์ ์ ์ํ๋ค๋ ์ฌ์ค ! ํด๋ก์ ๋ named Closure & unnamed Closure ๋๊ฐ์ง๋ฅผ ํฌํจํ๊ณ ์๋ค. ์ฐ๋ฆฌ๊ฐ ์๊ณ ์๋ ์ผ๋ฐ์ ์ธ ํจ์๋ named Closure์ด๋ค. func NameClosure() { print("I have a name") } ์ต๋ช ํจ์๋ ์ ํํ๋ unnamed Closure์ด์ง๋ง, ๋ณดํต unnamed์ ์๋ตํ๊ณ ๊ทธ๋ฅ ํด๋ก์ ๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์ฆ, ํด๋ก์ = ์ต๋ช ํจ์๋ผ๊ณ ํต์์ ์ผ๋ก ์๊ฐํ๋ฉด ๋ ๋ฏ ? ( ํด๋ก์ ๋ ์ต๋ช ํจ์์ด์ง๋ง, 1๊ธ ๊ฐ์ฒด ํจ์์ ํน์ฑ์ ๊ฐ์ง๋ค. ) ์..
[Swift] ์ ์ด๋ฌธ (์กฐ๊ฑด๋ฌธ / ๋ฐ๋ณต๋ฌธ)
์กฐ๊ฑด๋ฌธ if-else ๋ค๋ฅธ if๋ฌธ๊ณผ ํ์์ ๊ฐ๋ค. var num = 0 if num == 0 { //code } else if num == 10 { //code } else{ //code } ๋ค๋ฅธ์ ์ ์กฐ๊ฑด์ด ๋ฌด์กฐ๊ฑด Bool type์ด์ฌ์ผ ํ๋ค๋ ๊ฒ์ด๋ค. ์ฆ, ์ซ์ 0์ false์ด๊ณ , ๋๋จธ์ง๋ true ๋ผ๋ ๋ค๋ฅธ ์ธ์ด์ ํน์ฑ์ ์ง๋์ง ์๋๋ค. // error code var num = 0 if num { //code } switch ๋ค๋ฅธ ์ธ์ด์ switch์๋ ๋ฌ๋ฆฌ break๋ฅผ ๋ช ์ํ์ง ์์๋ ๋จ case์์ ๋ค๋ฃจ์ง ์๋ ๋ฒ์๊ฐ ์๋ ํ default ๋ถ๋ถ์ ๊ผญ ์จ์ฃผ๊ธฐ var num = 10 switch num { case 10: print("ten") default: print("not ten") } ..
[Swift] function / ํจ์
1. ํจ์์ ์ธ ๊ธฐ๋ณธ func ํจ์์ด๋ฆ (๋ณ์ : type, ๋ณ์ : type) -> return_type { //code return value } //ex (๋ํ๊ธฐ ํจ์) func add (a : Int, b : Int ) -> Int { return a+b } return โ func name(a: Int, b: Int) -> Void { //code } func name(a: Int, b: Int) { //code } ๋งค๊ฐ๋ณ์ โ func name() -> return_type { //code return } 2. ๋งค๊ฐ๋ณ์ ๊ธฐ๋ณธ๊ฐ ๐ ๋ณ์ : type = ๊ธฐ๋ณธ๊ฐ func add(a : Int, b: Int = 10) -> Int { // b๊ธฐ๋ณธ๊ฐ = 10 return (a+b) } ๊ธฐ๋ณธ๊ฐ์ ์ค์ ํ๋ฉด..
[Swift] collection type / ์ปฌ๋ ์ ํ์
1. Array ์์๊ฐ ์๋ ์ปฌ๋ ์ ์ ์ธํ๋ ๋ฐฉ๋ฒ var intArray : Array = Array() var intArray : Array = [] var intArray : [Int] = Array() var intArray : [Int] = [] var intArray = [Int]() ํ์ฉ var intArray : Array = [] intArray.append(1) // 1์ ์ฝ์ ํ๋ค. intArray.contains(1) // 1์ด ์กด์ฌํ๋์ง ํ์ธ => true intArray.remove(at:0) // 0๋ฒ์งธ index ๊ฐ ์ ๊ฑฐ intArray.removeLast() intArray.removeAll() intArray.count // ๊ธธ์ด ๋ฐํ intArray[0] // 0๋ฒ์งธ ind..