macOS์ iOS์ ๊ฐ๋ฐ์ ์ฌ์ฉ๋๋ UI Framework๋ ๋ชจ๋ Objective-C ๊ธฐ๋ฐ์ Framework์ด๋ค.
ํ์ง๋ง Objective-C๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๊ฐ ๊ฐ์ง ๋ฅ๋ ฅ์ด ๋ถ์กฑํ๊ณ , ๋ฌธ๋ฒ ๋ํ ์์ฐ์ฑ์ด ๋จ์ด์ก๋ค.
์ด์ Apple์ 2014๋ Swift ์ธ์ด๋ฅผ ์ ๋ณด์๊ณ , ๊ณ์ํด์ ๋น ๋ฅธ์๋๋ก ๋ฐ์ ํ๊ณ ์๋ค.
์ถ๊ฐ๋ก Swift 5.0, 5.1์์๋ ABI Stablity, ๋ชจ๋ ์์ ์ฑ์ ์ง์ํ๋ฉด์ ์์ ์ฑ๋ ํฌ๊ฒ ํฅ์๋์๋ค.
iOS UI๋ฅผ ์ํ UIKit์ Objective-C ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ ธ ์์ด, Swift ์ธ์ด๋ก ์์ฑํ์ฌ๋ @objc ์์ฑ์ ๋ช ์ํ๋ค๋๊ฐ ํธํ์ฑ์ ์ํ ๋ถ๊ฐ์ ์ธ ์์ ์ด ํ์ํ๋ค.
button.addTarget(self, action: #selector(anyfunc), for: .touchUpInside)
@objc
func anyfunc() {
...
}
๋ฐ๋ผ์ Swift ์ธ์ด ๊ธฐ๋ฐ์ UI Framework๊ฐ ํ์ํ๊ณ , ๊ทธ๋ ๊ฒ ๋ฑ์ฅํ๊ฒ ๋ ๊ฒ์ด SwiftUI์ด๋ค.
SwiftUI๋ Swift ์ธ์ด ๊ธฐ๋ฐ์ด๋ฉฐ Swift์ ๋ชจ๋ ํน์ฑ์ ์ต๋ํ ํ์ฉํ๋ ค ํ๊ณ ์๋ค.
macOS๋ฅผ ์ํ UIFramework๋ฅผ ๊ตฌ๋ถํ๋๊ฒ์ด ์๋ SwiftUI๋ก ๋ชจ๋ ํ๋ซํผ์์ ์ฌ์ฉํ ์ ์๋๋ก ๋ง๋ค์ด์ก๋ค.
Android์ Jetpack Compose์ ๋น์ทํ๋ค
UIKit์ ์ฌ์ฉํด UI๋ฅผ ๊ฐ๋ฐํ ๋๋ ๋ทฐ ๊ฐฑ์ , ํ์งํ, ์ ์ํ ๋ ์ด์์ ๋ฑ ์ฌ๋ฌ๊ฐ์ง ์ฝ๋๋ฅผ ์ง์ ์์ฑํด์ผ ํ์ง๋ง, SwiftUI์์๋ ํ๋ ์์ํฌ ๋ด๋ถ์์ ๋๋ถ๋ถ ์ง์ํ๋ค.
๋ฐ๋ผ์ UIKit์ผ๋ก ์์ฑํ ๋ ๋ณด๋ค ์๋นํ ์ฝ๋๊ฐ ์ค์ด๋ค๊ฒ๋๊ณ , ์ฝ์ด์ผํ ์ฝ๋๊ฐ ์ค์ด๋๋ ์ฝ๋๋ฅผ ์ดํดํ๋๋ฐ์๋ ๋์์ด๋๋ค.
๊ธฐ์กด UIKit์ ๋ช ๋ นํ(Imperative) ๋์ ์ ์ธํ(Declarative)ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ ํ์ฉ.
UI๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐฉ์, ๋ ์ด์์์ ๋จ๊ณ์ ์ผ๋ก ์์ฑํ๋ UIKit์ ๋ฐฉ์๊ณผ ๋ค๋ฅด๊ฒ ์ด๋ป๊ฒ ๋ ์ด์์์ ์ํฌ๊ฒ์ด๋ฉฐ ์ด๋ค ํฐํธ๋ฅผ ์ ์ฉํ ์ง ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ ์ธํ๋ ๋ฐฉ์์ด๋ค.
์ด๋ ๊ฒ๋๋ฉด ์ต์ข UI์ ํํ๋ฅผ ๋ง๋ก ์ ๋ฌํ๋ฏ์ด ํํ ๊ฐ๋ฅํ๋ค.
Xcode11๋ถํฐ SwiftUI๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฎฌ๋ ์ดํฐ๋ฅผ ๋น๋ํ๋ ๋์ preview์์ UI๋ฅผ ํ์ธ ๊ฐ๋ฅํ๋ค.
๋ฌผ๋ก UIKit์์๋ Preview๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ๋จ ๋น๋์ 3~5์ด ์ด์ ์์๋๋ค๋ฉด preview๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
preview์๋ ๋ณ๊ฒฝ์ฌํญ์ด ์ฆ๊ฐ์ ์ผ๋ก ๋ฐ์๋๋ฉฐ ๋คํฌ๋ชจ๋, ํ์งํ, ํฐํธ ๋ฑ์ ์ฌ๋ฌ ๋๋ฐ์ด์ค ํ๊ฒฝ์์ ํ์ธํ๋๊ฒ๋ ๊ฐ๋ฅํ๋ค
UIKit์ผ๋ก iOS, watchOS, tvOS ๋ฑ ์ฌ๋ฌ ํ๊ฒฝ์ UI๋ฅผ ์์ฑํ๊ฒ๋๋ค๋ฉด ํด๋น OS ์ ๋ง๋ ์ฝ๋๋ฅผ ์ถ๊ฐ๋ก ์์ฑํ๊ฑฐ๋ ์๋กญ๊ฒ UI๋ฅผ ๊ตฌ์ฑํด์ผํ๋ค.
๊ทธ๋ฌ๋ SwiftUI๋ ์๋น ๋ถ๋ถ์ ์ฌ์ฌ์ฉํ ์ ์๊ฒ ๋์ด ์ฌ๋ฌ ํ๊ฒฝ์ ์ฑ์ ๋ ์ฝ๊ฒ ๊ฐ๋ฐํ ์ ์๋ค.
SwiftUI๋ ์ ์ธํ ํจ๋ฌ๋ค์์ ์ ๋ชฉํ์๋ค. ์ ์ธํ๊ณผ ๋ช ๋ นํ์ ์ฐจ์ด๋ ์๋์ ๊ฐ๋ค
- ๋ช
๋ นํ์ ์ด๋ป๊ฒ(HOW) ์ํํด์ผํ๋์ง์ ๋ํด ์ด์ฒจ์ ๋ง์ถ๊ณ ์๋ค.
- ๋ช ๋ น์ ์ฌ๋ฐ๋ฅธ ์์๋ก ์คํํ์ง ์๋๋ค๋ฉด ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.
- ์ ์ธํ์ ๋ฌด์์(WHAT) ์ํํด์ผํ๋์ง์ ๋ํด ์ด์ฒจ์ ๋ง์ถ๊ณ ์๋ค.
- ๋ช ๋ น์ ๋ค๋ฃจ๋๋์ ํ๋ก๊ทธ๋จ์ด ์ํํด์ผํ๋ ๋ชฉ์ ์์ฒด๋ฅผ ์ค๋ช ํ๋ค.
๋ง์ ๊ธฐ๋ฅ๋ค์ด ์๋์ผ๋ก ์ํ๋ ์ ์๊ฒ๋ ์ค๊ณ๋์ด์๋ค.
AutoLayout์ ์ํ ๋ง์ ์ฝ๋๋ค์ด ์ ๊ฑฐ๋์๊ณ , ์ต์ํ์ ์ค๋ช ๋ง์ผ๋ก UI๋ฅผ ์์ฑํ ์ ์๊ฒ ๋์๋ค.
SwfitUI API๋ ๋ทฐ์ ์กฐํฉ๊ณผ ๋ถ๋ฆฌ๋ฅผ ๊ฐ๋จํ ํ ์ ์๊ฒ ์ ๊ณตํ๋ค.
๋ฐ๋ณต์ ์ธ UI ๊ฐ๋ฐ์ ๋์ฑ ๋น ๋ฅด๊ฒ ์งํํ ์ ์๊ฒ ๋์๊ณ , ์์ ๋ทฐ ๋จ์๋ก ์ชผ๊ฐ๊ณ ์ํ๋ ๋ฐฉ์์ผ๋ก ์กฐํฉํ์ฌ ์์ฝ๊ฒ ๋ทฐ๋ฅผ ๋ง๋ค์ด๋ผ ์ ์๋ค.
๋ protocol์ ๋ค์ํ modifier๋ฅผ ์ง์ํด protocol์ ์ค์ํ๋ ๋ชจ๋ ๊ฐ์ฒด์๊ฒ ๋์ผํ UI๋ ๊ธฐ๋ฅ์ ์์ฝ๊ฒ ์ ์ฉํ ์ ์๋ค.
UI๋ ํญ์ ๋ฐ์ดํฐ์ ๋๊ธฐํ ๋์ด์ผ ํ๋ค.
UIKit์์๋ ๋ฐ์ดํฐ์ UI๋ฅผ ๋๊ธฐํ ํ๊ธฐ์ํด ์๋์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ๊ณ ,
์ฌ๋ฌ ๊ธฐ์ ๋ค์ด ์ฌ์ฉ๋์ด ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ๋ ๋ง์์ก๋ค.
SwiftUI์์๋ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋ ์ฆ์ UI๋ ์๋์ผ๋ก ๋ณ๊ฒฝ๋๋ค.
์ด๋ฅผ ์ํด Source Of Truth๋ผ๋ ๊ฐ๋ ์ ์ฌ์ฉํ๊ฒ๋๋๋ฐ ์ด๋ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ๋ฐ๋ผ UI๊ฐ ๋ณ๊ฒฝ๋๋๊ฒ์ ์๋ฏธํ๋ค.
์ด๋ฅผ ํตํด ๋ฐ์ดํฐ์ UI๋ฅผ ๋๊ธฐํ ํ๋ ๋ถ๋ถ์์ ํญ์ ์ผ๊ด์ฑ ์๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.
Swift UI์ body ์ ์ฌ์ฉ๋๋ some
์ด Opaque Type์ ๊ด๋ จ๋ ํค์๋์ด๋ฉฐ, property, function๋ฑ return ํ์
์ ํ์ ์ ์ผ๋ก ์ฌ์ฉ๋๋ค.
UIKit์์๋ ๋ทฐ์ ์ค์ ์ ๋ฐ๊พธ๊ฑฐ๋, ๋ทฐ๋ฅผ ์ถ๊ฐํด๋ ์์ ๋ทฐ์ ํ์ ์ด ๋ณ๊ฒฝ๋์ง ์์์ง๋ง ๊ตฌ์กฐ์ฒด์ ์ ๋ค๋ฆญ์ ํ์ฉํ๋ SwiftUI์ ๊ตฌํ๋ฐฉ์์์๋ ๋ทฐ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๋ณ๊ฒฝํ ๋ ๋ง๋ค ์๋ก์ด ํ์ ์ด ๋ง๋ค์ด์ง๊ฒ ๋๋ค.
์ด๋ ๋ฏ ๋ทฐ๊ฐ ๋ณ๊ฒฝ๋ ๋ ๋ง๋ค body์ ํ์
์ ์๋ก ์ง์ ํ๊ธฐ์๋ ๋ฌด๋ฆฌ๊ฐ ์์ด some
ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ค ํ์
์ธ์ง์ ๋ํ ์ ๋ณด๋ฅผ ์จ๊ธฐ๊ณ , ์ฑํํ๋ ํ๋กํ ์ฝ์ ๋ํ ์ ๋ณด๋ฅผ ๋จ๊ธด ์ฑ API๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํด์ค๋ค. ์ด๋ก์ธํด API๋ ์ถ์ํ ๋๊ณ ๋ชจ๋๊ฐ ๊ฒฐํฉ๋๋ ๋ฎ์์ง๊ฒ ๋๋ค.
๋ถํฌ๋ช ํ์ ์ ํน์ ํ์ ์ ๋ํ ์ ์ฝ์กฐ๊ฑด์ ์ง์ ํ์ฌ ํ์ฅ์ฑ์ ๋์ด๋ ์ ๋ค๋ฆญ๊ณผ ๋ฐ๋๋๋ ๊ฐ๋ ์ด๋ค.
์ ๋ค๋ฆญ์ caller ์ธก์์ callee์ ํ์ ์ ๊ฒฐ์ ํ์ง๋ง
๋ถํฌ๋ช ํ์ ์ callee๊ฐ caller์ ํ์ ์ ๊ฒฐ์ ํ๋ค.
// Generic
func genericFunction<T: Animal>(_ animal: T) { ... } // callee๋ ํ์
์ ์ ๋ฌ๋ฐ๋๋ค
genericFunction(Dog()) // caller๊ฐ ์ ๋ฌํ ํ์
์ ๊ฒฐ์
genericFunction(Cat())
// Opaque Type
func opaqueTypeFunction() -> some Animal { Dog() } // callee๊ฐ ํ์
์ ๊ฒฐ์ (Dog)
let someAnimal: some Animal = opaqueTypeFunction() // caller๋ ์ถ์ํ๋ ํ์
์ ์ ๋ฌ๋ฐ์(some Animal)
์ ๋ค๋ฆญ์ ๋งค๊ฐ๋ณ์๋ ์ ์ ํ์ ์์คํ ์์๋ง ํ์ ์ ์จ๊ธฐ๊ณ ๋ฐํ์์์๋ ๋ ธ์ถ๋๋ค.
๋ถํฌ๋ช ํ์ ์ญ์ ๋ฐํ์์์ ํ์ ์ด ๋ ธ์ถ๋๊ธฐ ๋๋ฌธ์ ์๋ #1 Line ์ ์ปดํ์ผ ์๋ฌ๊ฐ ์ผ์ด๋๋ค.
protocol Animal { }
struct Dog: Animal {
var color: UIColor { UIColor.brown }
}
let dog: some Animal = Dog()
dog.color // #1
(dog as! Dog).color
๊ธฐ์กด์๋ ํ๋กํ ์ฝ์ ๋ฐํํ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์๊ณ , ํ๋กํ ์ฝ์ ์ค์ํ๋ ์ด๋ค ํ์ ์ด๋ ๋ฐํํ ์ ์๋ ์ ์ฐ์ฑ์ด ์ฅ์ ์ด์๋ค. ํ์ง๋ง ์๋ก ๋ค๋ฅธ ํ์ ์ด ๋ฐํ ๋ ์ ์๋ ์ ์์ ํ์ ์ ๋ํ ์ ๋ณด๋ฅผ ์๋ ๋จ์ ์ด ์๋ค.
protocol Animal {}
struct Dog: Animal {}
struct Cat: Animal {}
func returnType() -> Animal {
.random() ? Dog() : Cat()
}
let animal: Animal = returnType() // Cat? Dog?
์ด๋ฌํ ๋ฌธ์ ๋ ํ์ฌ ์ํ์์๋ ๋ฌธ์ ๊ฐ ์์ง๋ง ์ค์ฒฉ๊ตฌ์กฐ์์ ๋ฌธ์ ๋ฅผ ์ผ์ผํจ๋ค.
protocol P {}
struct SomeType: P {}
func nested<T: P>(_ param: T) -> P {
param
}
let foo: P = nested(SomeType()) // foo๋ P ํ์
์ด๋ฏ๋ก, protocol P๋ฅผ ๋ง์กฑ ํ ์ ์์
let bar = nested(foo)
๋ํ Self ํ์ ๋๋ associatedtype ํ์ ์ด ์ ์ธ๋ ํ๋กํ ์ฝ์ ํ์ ์ ๋ช ์ํ๊ฑฐ๋ ์ถ๋ก ํ ์ ์์ด์ผ ์ฌ์ฉํ ์ ์๋ค.
๊ทธ๋ฌ๋ฏ๋ก ๋ค์ ์ฝ๋๋ค์ ๋ชจ๋ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
func someFunction(_ lhs: Equatable, _ rhs: Equatable) -> Bool {} // Equatable์ Self ํ์
์
๋๋ค.
func someFunction() -> Hashable {} // Hashable์ Equatable์ ์ฑํํ๊ณ ์์ผ๋ฏ๋ก Self ํ์
์
๋๋ค.
var someProperty: Collection {} // Collection์ associatedtype ํ์
์ด ์ ์ธ๋์ด ์์ต๋๋ค.
ํ๋กํ ์ฝ์ ์ ์ฐํ ํ์ ์ด ์ฅ์ ์ด์ง๋ง ์ด๋ก ์ธํด ๋ถํ์คํ ๋ถ๋ถ์ด ์กด์ฌํ๋ฉฐ, ๋ถํฌ๋ช ํ์ ์ ์ด๋ฅผ ๋ณด์ํ๊ธฐ ์ํ ๋๊ฐ์ง ๋ฐฉ์์ ๊ฐ์ ํ๋ค.
๋ถํฌ๋ช ํ์ ์ ๋ฐํํ๋ ํ์ ์ ๋ฐ๋์ ์ค์ฒด ํ์ ์ด์ฌ์ผ ํ๋ค.
protocol Animal {}
struct Dog: Animal {}
struct Cat: Animal {}
func returnConcreteType() -> some Animal {
let result: Animal = Dog()
return result
}
์ ์ฝ๋๋ ์๋ฌ๋ฅผ ๋ฐ์์ํค๋ฉฐ ์ค์ฒด ํ์
์ด ์๋ Animal
ํ๋กํ ์ฝ์ ๋ฐํํ์ฌ ๋ฐ์ํ๋ค.
๋ฐ๋ผ์ result
์ ํ์
์ ์ค์ฒดํ์
์ธ Dog
๋ก ๋ณ๊ฒฝํ๋ฉด ์๋ฌ๊ฐ ํด๊ฒฐ๋๋ค.
ํ๋กํ ์ฝ์ด ์๋ ์ค์ฒดํ์ ์ ๋ฐํํ๊ฒ ํ๋๊ฒ์ ๋๋ฒ์งธ ๋ฐฉ์์ธ ์ธ์ ๋ ๋์ผํ์ ์ ๋ฐํํด์ผ ํ๋๊ฒ์ ์งํค๋ ค๋ ๊ฒ์ด๊ธฐ๋ ํ๋ค.
๋ฐํํ๋ ๊ฐ์ ๋ฌ๋ผ๋ ๋ฐํํ๋ ํ์ ์ ๋ฐ๋์ ๋์ผํด์ผํ๋ค.
Self ํ์ ์ด๋ associatedtype์ ๊ฐ์ง ํ๋กํ ์ฝ์ ์ฌ์ฉํ๋ ค๋ฉด ์ ๋ค๋ฆญ์ด ํ์ํ๋ค.
๋ค์์ฝ๋์ ํจ์์์ ์ ๋ค๋ฆญ ๋งค๊ฐ๋ณ์ T๋ ํจ์๋ฅผ ํธ์ถํ๋ ๊ณณ์์ ํ์ ์ ๋ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ฉฐ,
lhs์ rhs๋ผ๋ ๋งค๊ฐ๋ณ์๋ ๊ฐ์ด ๋ค๋ฅด๋๋ผ๋ ๋์ผํ ํ์ ์ ๊ฐ๋๋ค.
func genericFunction<T: Equatable>(_ lhs: T, _ rhs: T) -> Bool {
lhs == rhs
}
let gf1 = genericFunction("Swift", "UI") // ํธ์ถํ๋ ์ฝ๋๊ฐ ํ์
์ ๋ณด ์ ๊ณต
let gf2 = genericFunction(true, false)
let gf3 = genericFunction("Swift", true) // ํ์
์ด ๋ถ์ผ ์น ํ ๊ฒฝ์ฐ ์๋ฌ Conflicting arguments to generic parameter 'T' ('Bool' vs. 'String')
print(gf1)
print(gf2)
/*
false
false
*/
์์ ๋ถํฌ๋ช ํ์ ์ ์ ๋ค๋ฆญ์ ๋ฐ๋๋ก ์ ์ฉํ ๊ฐ๋ ์ด๋ผ๊ณ ์ธ๊ธํ๋ฏ์ด, ๋์ผํ๊ฒ ๋ฐ๋๋ก ์ ์ฉ๋๋ค.
Self ํ์ ์ด๋ aasociatedtype์ ํจ์์ ๋ฐํํ๋ ๊ฐ์ ๋ํ ํ์ ์ด ๋๋ฉฐ, ๊ฐ์ ์ํฉ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ผ๋ ํ์ ์ ํญ์ ๋์ผํด์ผ ํ๋ค.
func stringOpaqueTypeFunction() -> some Equatable {
.random() ? "Swift" : "UI" // ๋ฐํํ๋ ์ฝ๋๊ฐ ํ์
์ ๋ณด ์ ๊ณต
}
func boolOpaqueTypeFunction() -> some Equatable {
.random() ? true : false
}
func strangeOpaqueTypeFunction() -> some Equatable {
.random() ? "Swift" : true // Result values in '? :' expression have mismatching types 'String' and 'Bool'
}
let sotf1 = stringOpaqueTypeFunction()
let sotf2 = boolOpaqueTypeFunction()
print(sotf1)
print(sotf2)
/*
Swift
true
*/
๋ฐ๋ผ์ SwftUI์ body ํจ์์ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํ๊ฒ ๋๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
var body: some View {
.random() ? Rectangle() : Circle() // Result values in '? :' expression have mismatching types 'Rectangle' and 'Circle'
}
- ๋ถํฌ๋ช ํ์ (Opaque Type)์ ์์ธํ ํ์ ๊ณผ ๊ตฌํ์ ๋ํ ์ ๋ณด๋ฅผ ์จ๊ธฐ๊ณ ํน์ protocol์ ๋ฐ๋ฅด๋ API ๋ผ๋ ๊ฒ์ ๋ช ์ํ๋ค.
- prtocol ํ์ ์ ๋ฐํํ๋ฉด์ ํ์ ์ ๋ํ ์ ์ฒด์ฑ์ ๋ณด์ฅํ์ฌ API ๋ด๋ถ์์ ํ์ ๊ฒ์ฌ ๊ธฐ๋ฅ์ ํ์ฉ ํ ์ ์๋ค.
- some ํค์๋๋ property, index, ํจ์์ ๋ฐํ ํ์
์๋ง ์ ์ฉ ๊ฐ๋ฅํ๋ฉฐ, some ํค์๋๋ฅผ ์ ์ฉํ ์ ์๋ ํ์
์ ๋ค์๊ณผ ๊ฐ๋ค.
- protocol
- class
- Any
- AnyObject
๋ฆฌํด ์๋ต์ ๋จ์ผ ํํ์(single-expression)์ด ์์ฑ๋ ํจ์์ ๋ํด์๋ return ํค์๋๋ฅผ ์๋ตํ ์ ์๋ค.
ํํ์(expression)์ด๋ ์คํ์์ ๊ฐ์ ๋ฐํํ๊ฑฐ๋ side effect๋ฅผ ๋ฐ์ํ๊ฑฐ๋, ๋ ๋ค ๋ฐ์ํ๊ฒ๋๋ ์ฝ๋๋ฅผ ๋งํ๋ฉฐ Swift์์๋ prefix, infix, primary, postfix 4๊ฐ์ง์ ํํ์์ด ์กด์ฌํ๋ค.
์์ธ๋ด์ฉ์ ๋ฌธ์ ์ฐธ๊ณ
let add = { (a: Int, b: Int) in
a+b
}
func add(x: Int, y: Int) -> Int {
x+y
}
์ค์ํ์ ์ ๋จ์ผ ํํ์๊ณผ ๋จ์ผ ํ์ ๋ค๋ฅด๋ค๋ ์ ์ด๋ค.
var body: some View {
Text("title")
}
var body: some View {
Text("title")
.font(.title)
}
์๋์ body๋ ๋๊ฐ์ ํ์ผ๋ก ์์ฑ๋ ์ฝ๋์ง๋ง, ๋จ์ผ ํํ์์ด๋ฏ๋ก return ํค์๋๋ฅผ ์๋ตํ ์ ์๋ค.
if-else ๊ตฌ๋ฌธ์ ์ผํญ์ฐ์ฐ์์ ๊ฐ์ ์ญํ ์ด๋ผ๊ณ ์๊ฐ๋๊ธฐ ๋๋ฌธ์ ์๋์ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํ๋ ์ค์๊ฐ ์์ ์ ์๋๋ฐ,
๊ตฌ๋ฌธ๊ณผ ํํ์์ ์ฐจ์ด๋ผ๋๊ฒ์ ์์๋์
// ์ปดํ์ผ ์ฑ๊ณต
var body: some View {
true ? Text("์ฑ๊ณต") : Text("์คํจ")
}
// ์ปดํ์ผ ์ค๋ฅ
var body: some View {
if true {
Text("์ฑ๊ณต")
else {
Text("์คํจ")
}
}
// ์ปดํ์ผ ์ฑ๊ณต
var body: some View {
if true {
return Text("์ฑ๊ณต")
else {
return Text("์คํจ")
}
}