SlideShare ist ein Scribd-Unternehmen logo
1 von 78
Downloaden Sie, um offline zu lesen
SE-0247
SE-0245
SE-0255
SE-0244
SE-0251
SE-0252
SE-0242
SE-0258
SE-0254
SE-0260
SE-0261
SE-0244
SE-0255
SE-0258
SE-0261
SE-0255
SE-0244
SE-0261
Implicit returns from single-expression functions
Opaque Result Types
Identifiable Protocol
SE-0258 Property Wrappers
Implicit returns from single-
expression functions
SE-0255
closuresImplicit returns from
let sum = { (lhs: Int, rhs: Int) in
lhs + rhs
}
[1, 2, 3, 4, 5]
.map { $0 * 2 }
[true, false, true]
.filter { $0 }
functionsImplicit returns from
func sum(_ lhs: Int, _ rhs: Int) -> Int {
return lhs + rhs
}1
functionsImplicit returns from
func sum(_ lhs: Int, _ rhs: Int) -> Int {
lhs + rhs
}1
functionsImplicit returns from
func sum(_ lhs: Int, _ rhs: Int) -> Int {
let result = lhs + rhs
result
}1
Implicit returns from functionssingle-expression
func sum(_ lhs: Int, _ rhs: Int) -> Int {
let result = lhs + rhs
result
}1
Implicit returns from functionssingle-expression
func sum(_ lhs: Int, _ rhs: Int) -> Int {
let result = lhs + rhs
return result
}1
Computed property
struct ContentView: View {
var body: some View {
Text("Hello world!")
}1
}1
Computed property
struct ContentView: View {
var body: some View {
let text = "Hello world!"
Text(text)
}1
}1
struct ContentView: View {
var body: some View {
let text = "Hello world!"
return Text(text)
}1
}1
Computed property
Single-expression
struct ContentView: View {
var body: some View {
Text("Hello world!").font(.title).bold()
}1
}1
Single-expression
struct ContentView: View {
var body: some View {
Text("Hello world!")
.font(.title)
.bold()
}1
}1
Evaluating an expression
• Returns a value
• Causes a side effect
• Both
• Ternary Conditional Operator
Expression vs Statement
return .random() ? true : false
if .random() {
return true
} else {
return false
}
• If - else
• Ternary Conditional Operator
Expression vs Statement
return .random() ? true : false
if .random() {
return true
} else {
return false
}
• If - else
Expression
Statement
Expression vs Statement
var body: some View {
.random() ? Text("true") : Text("false")
}1
var body: some View {
if .random() {
Text("true")
} else {
Text("false")
}
}
• Ternary Conditional Operator
• If - else
Expression
Statement
Expression vs Statement
var body: some View {
.random() ? Text("true") : Text("false")
}1
var body: some View {
if .random() {
return Text("true")
} else {
return Text("false")
}
}
• Ternary Conditional Operator
• If - else
Expression
Statement
• Function,Computed property
Implicit returns from single-expression functionsSE-0255
• Single-expression
• Implicit return
Opaque Result Types
SE-0244
some
struct ContentView: View {
var body: some View {1
Text("Hello SwiftUI!")
}1
}1
without some
struct ContentView: View {
var body: View {1
Text("Hello SwiftUI!")
}1
}1
Error - View has associated type
struct ContentView: View {
var body: View {
Text("Hello SwiftUI!")
}1
}1
protocol View {
associatedtype Body : View
var body: Self.Body { get }
}1
View return type
var body: Text {1
Text("Hello SwiftUI!")
}1
View return type
var body: Text {1
Text("Hello SwiftUI!")
.foregroundColor(.white)
.background(Color.black)
}1
var body:
ModifiedContent<Text, _BackgroundModifier<Color>>
{1
Text("Hello SwiftUI!")
.foregroundColor(.white)
.background(Color.black)
}1
View return type
var body:
ModifiedContent<VStack<TupleView<(ModifiedContent<I
mage, _AspectRatioLayout>, ModifiedContent<Text,
_BackgroundModifier<Color>>)>>, _PaddingLayout>
{1
VStack {2
Image("SwiftUI")
.resizable()
.scaledToFit()
Text("Hello SwiftUI!")
.foregroundColor(.white)
.background(Color.black)
}.padding()
}3
View return type
var body: some View {1
VStack {2
Image("SwiftUI")
.resizable()
.scaledToFit()
Text("Hello SwiftUI!")
.foregroundColor(.white)
.background(Color.black)
}.padding()
}3
Opaque type
func genericFunction<T: Animal>(_ animal: T) {
... // Callee - abstracted type
}
// T == Dog, Caller pick the type
genericFunction(Dog())
Abstracted type - Generic
// T == Cat
genericFunction(Cat())
func opaqueTypeFunction() -> some Animal {
Dog() // Callee pick the type
}
// Caller - abstracted type
let animal: some Animal = opaqueTypeFunction()
Abstracted type - Opaque type
Protocol return type
func protocolReturnType() -> Animal {
.random() ? Dog() : Cat()
}
// Dog? Cat?
let animal: Animal = protocolReturnType()
Self or associated type
func someFunction(
lhs: Equatable,
rhs: Equatable
) -> Bool { ... }
func someFunction() -> Hashable { ... }
var someProperty: Collection { ... }
Type identity
func returnConcreteType() -> some Animal {
let result: Animal = Dog()
return result
}
func returnConcreteType() -> some Animal {
Dog()
}
Type identity
func genericFunc<T: Equatable>(
lhs: T, rhs: T
) -> Bool {
lhs == rhs // Same generic type T
}
// Caller pick the type
genericFunction(lhs: "Swift", rhs: "UI")
Type identity
func opaqueTypeFunc() -> some Equatable {
.random() ? "Swift" : 5.1
}
func opaqueTypeFunc() -> some Equatable {
// Callee pick the type
// Same return type
.random() ? "Swift" : "UI"
}
var body: some View {
.random()
? Rectangle()
: Circle()
}
SwiftUI
var body: some View {
.random()
? AnyView(Rectangle())
: AnyView(Circle())
}
• Hiding type information
Opaque Result TypesSE-0244
• Preserving type information
• Reverse generic
Identifiable Protocol
SE-0261
struct Animal: Equatable {1
let name: String
let age: Int
}1
let 🐶 = Animal(name: " ", age: 5)
let 🐰 = Animal(name: " ", age: 5)
Equatable
🐶 == 🐰 // true
struct Animal: Equatable {1
let name: String
let age: Int
}1
Equatable
struct Animal: Equatable {1
let id: Int
let name: String
let age: Int
}1
Equatable
struct Animal: Equatable {
let id: Int
let name: String
let age: Int
}
Equatable
let 🐶𝞪 = Animal(id: 1, name: " ", age: 5)
let 🐶𝞫 = Animal(id: 1, name: " ", age: 6)
Equatable
// false
🐶𝞪 == 🐶𝞫
// true
🐶𝞪.id == 🐶𝞫.id
Equatable
// false
🐶𝞪 == 🐶𝞫
// true
🐶𝞪.id == 🐶𝞫.id
// Identity Operator, Reference type
🐶𝞪 === 🐶𝞫
Identifiable Protocol
protocol Identifiable {
associatedtype ID : Hashable
var id: Self.ID { get }
}
Identifiable Protocol
protocol Identifiable {
associatedtype ID : Hashable
var id: Self.ID { get }
}
extension Animal: Identifiable {}
Diff algorithm
let 🐶𝞪 = Animal(id: 1, name: " ", age: 5)
let 🐶𝞫 = Animal(id: 1, name: " ", age: 6)
...
let 🐶𝞬 = Animal(id: 1, name: " ", age: 10)
...
🐶𝞪 <---> 🐶𝞫 <---> 🐶𝞬
SwiftUI
extension List {
init<Data, RowContent>(_ data: Data,
...
) where Data.Element : Identifiable
}
extension View {
func alert<Item>(item: Binding<Item?>,
...
) -> some View where Item : Identifiable
}
SwiftUI
ForEach(["Data1", "Data2", "Data3"], id: .self)
ForEach([🐶, 🐱, 🐰], id: .id)
SwiftUI
ForEach([🐶, 🐱, 🐰])
ForEach(["Data1", "Data2", "Data3"], id: .self)
ForEach([🐶, 🐱, 🐰], id: .id)
SwiftUI
ForEach([🐶, 🐱, 🐰]) { ... }
let 🐶 = Animal(id: 1, name: " ", age: 5)
let 🐱 = Animal(id: 2, name: " ", age: 2)
let 🐰 = Animal(id: 3, name: " ", age: 3)
SwiftUI
ForEach([🐶, 🐱, 🐰]) { ... }
let 🐶 = Animal(id: 1, name: " ", age: 5)
let 🐱 = Animal(id: 1, name: " ", age: 2)
let 🐰 = Animal(id: 1, name: " ", age: 3)
SwiftUI
ForEach([🐶, 🐱, 🐰]) { ... }
let 🐶 = Animal(id: 1, name: " ", age: 5)
let 🐱 = Animal(id: 1, name: " ", age: 2)
let 🐰 = Animal(id: 1, name: " ", age: 3)
• Distinguish the identity of an entity from the state
Identifiable ProtocolSE-0261
• Identify changes to the state
• Value type identity
Property Wrappers
SE-0258
struct ContentView: View {
@State private var isOn: Bool = false
var body: some View {
Toggle(isOn: $isOn) { Text("Label") }
}
}
SwiftUI
struct ContentView: View {
@State private var isOn: Bool = false
var body: some View {
Toggle(isOn: $isOn) { Text("Label") }
}
}
SwiftUI
@State
@Binding
@ObservedObject
@EnvironmentObject
@Environment
@IBOutlet
@NSCopying
@available
@objc
lazy
...
Attributes
struct SomeType {
var someValue = 0
lazy var someLazyValue = self.someValue + 1
}1
lazy
struct SomeType {
var someValue = 0
lazy var someLazyValue = self.someValue + 1
lazy var anotherLazyValue = self.someValue * 2
}1
lazy
Boilerplate
var isLoggedIn: Bool {
get {
UserDefaults.standard.bool(forKey: "IS_LOGGED_IN")
}
set {
UserDefaults.standard.set(newValue, forKey: "IS_LOGGED_IN")
}
}
Boilerplate
var isLoggedIn: Bool {
get {
UserDefaults.standard.bool(forKey: "IS_LOGGED_IN")
}
set {
UserDefaults.standard.set(newValue, forKey: "IS_LOGGED_IN")
}
}
var isFirstLogin: Bool {
get {
UserDefaults.standard.bool(forKey: "IS_FIRST_LOGIN")
}
set {
UserDefaults.standard.set(newValue, forKey: "IS_FIRST_LOGIN")
}
}
Wrapper Type
@propertyWrapper
struct UserDefault<Value> {
let key: String
var wrappedValue: Value? {
get {
UserDefaults.standard.object(forKey: key) as? Value
}
set {
UserDefaults.standard.set(newValue, forKey: key)
}
}
}
Custom attribute
struct User {
@UserDefault(key: "IS_LOGGED_IN")
var isLoggedIn: Bool
@UserDefault(key: "IS_FIRST_LOGIN")
var isFirstLogin: Bool
}
Custom attribute
struct User {
@UserDefault(key: "IS_LOGGED_IN")
var isLoggedIn: Bool
@UserDefault(key: "IS_FIRST_LOGIN")
var isFirstLogin: Bool
}
var user = User()
user.isLoggedIn = true
user.isFirstLogin = false
print(user.isLoggedIn ?? false)
print(user.isFirstLogin ?? true)
Synthesized property
@UserDefault(key: "IS_LOGGED_IN")
var isLoggedIn: Bool
Synthesized property
@UserDefault(key: "IS_LOGGED_IN")
var isLoggedIn: Bool
private var _isLoggedIn: UserDefault<Bool>
= UserDefault<Bool>(key: "IS_LOGGED_IN")
var isLoggedIn: Bool {
get { _isLoggedIn.wrappedValue }
set { _isLoggedIn.wrappedValue = newValue }
}
// Synthesized property
Synthesized property
struct UserDefault<Value> {
var projectedValue: Self {
get { self }
set { self = newValue }
}
}
Synthesized property
struct UserDefault<Value> {
var projectedValue: Self {
get { self }
set { self = newValue }
}
}
struct User {
var $isLoggedIn: UserDefault<Bool> {
get { _isLoggedIn.projectedValue }
set { _isLoggedIn.projectedValue = newValue }
}
}
Synthesized property
isLoggedIn // Computed Property
_isLoggedIn // Stored Property, Private
$isLoggedIn // Computed Property, Optional
@UserDefault(key: "IS_LOGGED_IN")
var isLoggedIn: Bool
• Allow defining patterns for properties
Property WrappersSE-0258
• Provides the storage for a property
• Eliminate boilerplate code
Swift in SwiftUI
Swift in SwiftUI
Swift in SwiftUI

Weitere ähnliche Inhalte

Was ist angesagt?

Introducing Clean Architecture
Introducing Clean ArchitectureIntroducing Clean Architecture
Introducing Clean ArchitectureRoc Boronat
 
SwiftUI - Performance and Memory Management
SwiftUI - Performance and Memory ManagementSwiftUI - Performance and Memory Management
SwiftUI - Performance and Memory ManagementWannitaTolaema
 
Inversion of Control and Dependency Injection
Inversion of Control and Dependency InjectionInversion of Control and Dependency Injection
Inversion of Control and Dependency InjectionDinesh Sharma
 
Microservice With Spring Boot and Spring Cloud
Microservice With Spring Boot and Spring CloudMicroservice With Spring Boot and Spring Cloud
Microservice With Spring Boot and Spring CloudEberhard Wolff
 
Clean Architecture
Clean ArchitectureClean Architecture
Clean ArchitectureBadoo
 
Spring Framework - AOP
Spring Framework - AOPSpring Framework - AOP
Spring Framework - AOPDzmitry Naskou
 
Using hilt in a modularized project
Using hilt in a modularized projectUsing hilt in a modularized project
Using hilt in a modularized projectFabio Collini
 
The Kotlin Programming Language
The Kotlin Programming LanguageThe Kotlin Programming Language
The Kotlin Programming Languageintelliyole
 
Firebase & SwiftUI Workshop
Firebase & SwiftUI WorkshopFirebase & SwiftUI Workshop
Firebase & SwiftUI WorkshopPeter Friese
 
Dependency Injection
Dependency InjectionDependency Injection
Dependency InjectionKnoldus Inc.
 
Clean architecture
Clean architectureClean architecture
Clean architectureLieven Doclo
 
Jetpack Compose beginner.pdf
Jetpack Compose beginner.pdfJetpack Compose beginner.pdf
Jetpack Compose beginner.pdfAayushmaAgrawal
 
Spring Boot in Action
Spring Boot in Action Spring Boot in Action
Spring Boot in Action Alex Movila
 
Routing & Navigating Pages in Angular 2
Routing & Navigating Pages in Angular 2Routing & Navigating Pages in Angular 2
Routing & Navigating Pages in Angular 2Knoldus Inc.
 
Sharing Data Between Angular Components
Sharing Data Between Angular ComponentsSharing Data Between Angular Components
Sharing Data Between Angular ComponentsSquash Apps Pvt Ltd
 

Was ist angesagt? (20)

Clean Architecture
Clean ArchitectureClean Architecture
Clean Architecture
 
Introducing Clean Architecture
Introducing Clean ArchitectureIntroducing Clean Architecture
Introducing Clean Architecture
 
SwiftUI - Performance and Memory Management
SwiftUI - Performance and Memory ManagementSwiftUI - Performance and Memory Management
SwiftUI - Performance and Memory Management
 
Inversion of Control and Dependency Injection
Inversion of Control and Dependency InjectionInversion of Control and Dependency Injection
Inversion of Control and Dependency Injection
 
Microservice With Spring Boot and Spring Cloud
Microservice With Spring Boot and Spring CloudMicroservice With Spring Boot and Spring Cloud
Microservice With Spring Boot and Spring Cloud
 
Clean Architecture
Clean ArchitectureClean Architecture
Clean Architecture
 
Spring Framework - AOP
Spring Framework - AOPSpring Framework - AOP
Spring Framework - AOP
 
Using hilt in a modularized project
Using hilt in a modularized projectUsing hilt in a modularized project
Using hilt in a modularized project
 
The Kotlin Programming Language
The Kotlin Programming LanguageThe Kotlin Programming Language
The Kotlin Programming Language
 
Firebase & SwiftUI Workshop
Firebase & SwiftUI WorkshopFirebase & SwiftUI Workshop
Firebase & SwiftUI Workshop
 
Dependency Injection
Dependency InjectionDependency Injection
Dependency Injection
 
Clean architecture
Clean architectureClean architecture
Clean architecture
 
Jetpack Compose beginner.pdf
Jetpack Compose beginner.pdfJetpack Compose beginner.pdf
Jetpack Compose beginner.pdf
 
Spring Boot in Action
Spring Boot in Action Spring Boot in Action
Spring Boot in Action
 
Spring data jpa
Spring data jpaSpring data jpa
Spring data jpa
 
Routing & Navigating Pages in Angular 2
Routing & Navigating Pages in Angular 2Routing & Navigating Pages in Angular 2
Routing & Navigating Pages in Angular 2
 
Dependency injection ppt
Dependency injection pptDependency injection ppt
Dependency injection ppt
 
Sharing Data Between Angular Components
Sharing Data Between Angular ComponentsSharing Data Between Angular Components
Sharing Data Between Angular Components
 
Swift vs Objective-C
Swift vs Objective-CSwift vs Objective-C
Swift vs Objective-C
 
Json Web Token - JWT
Json Web Token - JWTJson Web Token - JWT
Json Web Token - JWT
 

Ähnlich wie Swift in SwiftUI

Casting for not so strange actors
Casting for not so strange actorsCasting for not so strange actors
Casting for not so strange actorszucaritask
 
JavaScript and the AST
JavaScript and the ASTJavaScript and the AST
JavaScript and the ASTJarrod Overson
 
[E-Dev-Day-US-2015][8/9] he EFL API in Review (Tom Hacohen)
[E-Dev-Day-US-2015][8/9] he EFL API in Review (Tom Hacohen)[E-Dev-Day-US-2015][8/9] he EFL API in Review (Tom Hacohen)
[E-Dev-Day-US-2015][8/9] he EFL API in Review (Tom Hacohen)EnlightenmentProject
 
JSLT: JSON querying and transformation
JSLT: JSON querying and transformationJSLT: JSON querying and transformation
JSLT: JSON querying and transformationLars Marius Garshol
 
appengine java night #1
appengine java night #1appengine java night #1
appengine java night #1Shinichi Ogawa
 
Kotlin for Android Developers - 3
Kotlin for Android Developers - 3Kotlin for Android Developers - 3
Kotlin for Android Developers - 3Mohamed Nabil, MSc.
 
Introduction to R
Introduction to RIntroduction to R
Introduction to Rvpletap
 
Don't Be STUPID, Grasp SOLID - ConFoo Edition
Don't Be STUPID, Grasp SOLID - ConFoo EditionDon't Be STUPID, Grasp SOLID - ConFoo Edition
Don't Be STUPID, Grasp SOLID - ConFoo EditionAnthony Ferrara
 
Serializing EMF models with Xtext
Serializing EMF models with XtextSerializing EMF models with Xtext
Serializing EMF models with Xtextmeysholdt
 
Front end fundamentals session 1: javascript core
Front end fundamentals session 1: javascript coreFront end fundamentals session 1: javascript core
Front end fundamentals session 1: javascript coreWeb Zhao
 
SummaryHW6 Account ManagementIn HW4, you kept track of multiple.pdf
SummaryHW6 Account ManagementIn HW4, you kept track of multiple.pdfSummaryHW6 Account ManagementIn HW4, you kept track of multiple.pdf
SummaryHW6 Account ManagementIn HW4, you kept track of multiple.pdfARORACOCKERY2111
 
A Lifecycle Of Code Under Test by Robert Fornal
A Lifecycle Of Code Under Test by Robert FornalA Lifecycle Of Code Under Test by Robert Fornal
A Lifecycle Of Code Under Test by Robert FornalQA or the Highway
 
Alternatives of JPA/Hibernate
Alternatives of JPA/HibernateAlternatives of JPA/Hibernate
Alternatives of JPA/HibernateSunghyouk Bae
 
Advanced SQL Webinar
Advanced SQL WebinarAdvanced SQL Webinar
Advanced SQL WebinarRam Kedem
 
Class 2 - Introduction to PHP
Class 2 - Introduction to PHPClass 2 - Introduction to PHP
Class 2 - Introduction to PHPAhmed Swilam
 
Getting the most out of Java [Nordic Coding-2010]
Getting the most out of Java [Nordic Coding-2010]Getting the most out of Java [Nordic Coding-2010]
Getting the most out of Java [Nordic Coding-2010]Sven Efftinge
 
Writing a compiler in go
Writing a compiler in goWriting a compiler in go
Writing a compiler in goYusuke Kita
 
Swift, functional programming, and the future of Objective-C
Swift, functional programming, and the future of Objective-CSwift, functional programming, and the future of Objective-C
Swift, functional programming, and the future of Objective-CAlexis Gallagher
 

Ähnlich wie Swift in SwiftUI (20)

Eo fosdem 15
Eo fosdem 15Eo fosdem 15
Eo fosdem 15
 
Casting for not so strange actors
Casting for not so strange actorsCasting for not so strange actors
Casting for not so strange actors
 
JavaScript and the AST
JavaScript and the ASTJavaScript and the AST
JavaScript and the AST
 
ITU - MDD - XText
ITU - MDD - XTextITU - MDD - XText
ITU - MDD - XText
 
[E-Dev-Day-US-2015][8/9] he EFL API in Review (Tom Hacohen)
[E-Dev-Day-US-2015][8/9] he EFL API in Review (Tom Hacohen)[E-Dev-Day-US-2015][8/9] he EFL API in Review (Tom Hacohen)
[E-Dev-Day-US-2015][8/9] he EFL API in Review (Tom Hacohen)
 
JSLT: JSON querying and transformation
JSLT: JSON querying and transformationJSLT: JSON querying and transformation
JSLT: JSON querying and transformation
 
appengine java night #1
appengine java night #1appengine java night #1
appengine java night #1
 
Kotlin for Android Developers - 3
Kotlin for Android Developers - 3Kotlin for Android Developers - 3
Kotlin for Android Developers - 3
 
Introduction to R
Introduction to RIntroduction to R
Introduction to R
 
Don't Be STUPID, Grasp SOLID - ConFoo Edition
Don't Be STUPID, Grasp SOLID - ConFoo EditionDon't Be STUPID, Grasp SOLID - ConFoo Edition
Don't Be STUPID, Grasp SOLID - ConFoo Edition
 
Serializing EMF models with Xtext
Serializing EMF models with XtextSerializing EMF models with Xtext
Serializing EMF models with Xtext
 
Front end fundamentals session 1: javascript core
Front end fundamentals session 1: javascript coreFront end fundamentals session 1: javascript core
Front end fundamentals session 1: javascript core
 
SummaryHW6 Account ManagementIn HW4, you kept track of multiple.pdf
SummaryHW6 Account ManagementIn HW4, you kept track of multiple.pdfSummaryHW6 Account ManagementIn HW4, you kept track of multiple.pdf
SummaryHW6 Account ManagementIn HW4, you kept track of multiple.pdf
 
A Lifecycle Of Code Under Test by Robert Fornal
A Lifecycle Of Code Under Test by Robert FornalA Lifecycle Of Code Under Test by Robert Fornal
A Lifecycle Of Code Under Test by Robert Fornal
 
Alternatives of JPA/Hibernate
Alternatives of JPA/HibernateAlternatives of JPA/Hibernate
Alternatives of JPA/Hibernate
 
Advanced SQL Webinar
Advanced SQL WebinarAdvanced SQL Webinar
Advanced SQL Webinar
 
Class 2 - Introduction to PHP
Class 2 - Introduction to PHPClass 2 - Introduction to PHP
Class 2 - Introduction to PHP
 
Getting the most out of Java [Nordic Coding-2010]
Getting the most out of Java [Nordic Coding-2010]Getting the most out of Java [Nordic Coding-2010]
Getting the most out of Java [Nordic Coding-2010]
 
Writing a compiler in go
Writing a compiler in goWriting a compiler in go
Writing a compiler in go
 
Swift, functional programming, and the future of Objective-C
Swift, functional programming, and the future of Objective-CSwift, functional programming, and the future of Objective-C
Swift, functional programming, and the future of Objective-C
 

Mehr von Bongwon Lee

DeprecatedAPI로 알아보는 SwiftUI
DeprecatedAPI로 알아보는 SwiftUIDeprecatedAPI로 알아보는 SwiftUI
DeprecatedAPI로 알아보는 SwiftUIBongwon Lee
 
GraphQL over REST
GraphQL over RESTGraphQL over REST
GraphQL over RESTBongwon Lee
 
The Sandbox Container Directory
The Sandbox Container DirectoryThe Sandbox Container Directory
The Sandbox Container DirectoryBongwon Lee
 
Simulator customizing & testing for Xcode 9
Simulator customizing & testing for Xcode 9Simulator customizing & testing for Xcode 9
Simulator customizing & testing for Xcode 9Bongwon Lee
 
LetSwift 2017 - ARKit
LetSwift 2017 - ARKitLetSwift 2017 - ARKit
LetSwift 2017 - ARKitBongwon Lee
 
Realm, Mobile Database
Realm, Mobile DatabaseRealm, Mobile Database
Realm, Mobile DatabaseBongwon Lee
 
Custom Xcode Template (with VIPER)
Custom Xcode Template (with VIPER)Custom Xcode Template (with VIPER)
Custom Xcode Template (with VIPER)Bongwon Lee
 

Mehr von Bongwon Lee (8)

DeprecatedAPI로 알아보는 SwiftUI
DeprecatedAPI로 알아보는 SwiftUIDeprecatedAPI로 알아보는 SwiftUI
DeprecatedAPI로 알아보는 SwiftUI
 
App Lifecycle
App LifecycleApp Lifecycle
App Lifecycle
 
GraphQL over REST
GraphQL over RESTGraphQL over REST
GraphQL over REST
 
The Sandbox Container Directory
The Sandbox Container DirectoryThe Sandbox Container Directory
The Sandbox Container Directory
 
Simulator customizing & testing for Xcode 9
Simulator customizing & testing for Xcode 9Simulator customizing & testing for Xcode 9
Simulator customizing & testing for Xcode 9
 
LetSwift 2017 - ARKit
LetSwift 2017 - ARKitLetSwift 2017 - ARKit
LetSwift 2017 - ARKit
 
Realm, Mobile Database
Realm, Mobile DatabaseRealm, Mobile Database
Realm, Mobile Database
 
Custom Xcode Template (with VIPER)
Custom Xcode Template (with VIPER)Custom Xcode Template (with VIPER)
Custom Xcode Template (with VIPER)
 

Kürzlich hochgeladen

9892124323 | Book Call Girls in Juhu and escort services 24x7
9892124323 | Book Call Girls in Juhu and escort services 24x79892124323 | Book Call Girls in Juhu and escort services 24x7
9892124323 | Book Call Girls in Juhu and escort services 24x7Pooja Nehwal
 
BDSM⚡Call Girls in Sector 71 Noida Escorts >༒8448380779 Escort Service
BDSM⚡Call Girls in Sector 71 Noida Escorts >༒8448380779 Escort ServiceBDSM⚡Call Girls in Sector 71 Noida Escorts >༒8448380779 Escort Service
BDSM⚡Call Girls in Sector 71 Noida Escorts >༒8448380779 Escort ServiceDelhi Call girls
 
CALL ON ➥8923113531 🔝Call Girls Saharaganj Lucknow best sexual service
CALL ON ➥8923113531 🔝Call Girls Saharaganj Lucknow best sexual serviceCALL ON ➥8923113531 🔝Call Girls Saharaganj Lucknow best sexual service
CALL ON ➥8923113531 🔝Call Girls Saharaganj Lucknow best sexual serviceanilsa9823
 
FULL ENJOY - 9999218229 Call Girls in {Mahipalpur}| Delhi NCR
FULL ENJOY - 9999218229 Call Girls in {Mahipalpur}| Delhi NCRFULL ENJOY - 9999218229 Call Girls in {Mahipalpur}| Delhi NCR
FULL ENJOY - 9999218229 Call Girls in {Mahipalpur}| Delhi NCRnishacall1
 
CALL ON ➥8923113531 🔝Call Girls Gomti Nagar Lucknow best Night Fun service
CALL ON ➥8923113531 🔝Call Girls Gomti Nagar Lucknow best Night Fun serviceCALL ON ➥8923113531 🔝Call Girls Gomti Nagar Lucknow best Night Fun service
CALL ON ➥8923113531 🔝Call Girls Gomti Nagar Lucknow best Night Fun serviceanilsa9823
 
Powerful Love Spells in Arkansas, AR (310) 882-6330 Bring Back Lost Lover
Powerful Love Spells in Arkansas, AR (310) 882-6330 Bring Back Lost LoverPowerful Love Spells in Arkansas, AR (310) 882-6330 Bring Back Lost Lover
Powerful Love Spells in Arkansas, AR (310) 882-6330 Bring Back Lost LoverPsychicRuben LoveSpells
 
Call US Pooja 9892124323 ✓Call Girls In Mira Road ( Mumbai ) secure service,
Call US Pooja 9892124323 ✓Call Girls In Mira Road ( Mumbai ) secure service,Call US Pooja 9892124323 ✓Call Girls In Mira Road ( Mumbai ) secure service,
Call US Pooja 9892124323 ✓Call Girls In Mira Road ( Mumbai ) secure service,Pooja Nehwal
 

Kürzlich hochgeladen (7)

9892124323 | Book Call Girls in Juhu and escort services 24x7
9892124323 | Book Call Girls in Juhu and escort services 24x79892124323 | Book Call Girls in Juhu and escort services 24x7
9892124323 | Book Call Girls in Juhu and escort services 24x7
 
BDSM⚡Call Girls in Sector 71 Noida Escorts >༒8448380779 Escort Service
BDSM⚡Call Girls in Sector 71 Noida Escorts >༒8448380779 Escort ServiceBDSM⚡Call Girls in Sector 71 Noida Escorts >༒8448380779 Escort Service
BDSM⚡Call Girls in Sector 71 Noida Escorts >༒8448380779 Escort Service
 
CALL ON ➥8923113531 🔝Call Girls Saharaganj Lucknow best sexual service
CALL ON ➥8923113531 🔝Call Girls Saharaganj Lucknow best sexual serviceCALL ON ➥8923113531 🔝Call Girls Saharaganj Lucknow best sexual service
CALL ON ➥8923113531 🔝Call Girls Saharaganj Lucknow best sexual service
 
FULL ENJOY - 9999218229 Call Girls in {Mahipalpur}| Delhi NCR
FULL ENJOY - 9999218229 Call Girls in {Mahipalpur}| Delhi NCRFULL ENJOY - 9999218229 Call Girls in {Mahipalpur}| Delhi NCR
FULL ENJOY - 9999218229 Call Girls in {Mahipalpur}| Delhi NCR
 
CALL ON ➥8923113531 🔝Call Girls Gomti Nagar Lucknow best Night Fun service
CALL ON ➥8923113531 🔝Call Girls Gomti Nagar Lucknow best Night Fun serviceCALL ON ➥8923113531 🔝Call Girls Gomti Nagar Lucknow best Night Fun service
CALL ON ➥8923113531 🔝Call Girls Gomti Nagar Lucknow best Night Fun service
 
Powerful Love Spells in Arkansas, AR (310) 882-6330 Bring Back Lost Lover
Powerful Love Spells in Arkansas, AR (310) 882-6330 Bring Back Lost LoverPowerful Love Spells in Arkansas, AR (310) 882-6330 Bring Back Lost Lover
Powerful Love Spells in Arkansas, AR (310) 882-6330 Bring Back Lost Lover
 
Call US Pooja 9892124323 ✓Call Girls In Mira Road ( Mumbai ) secure service,
Call US Pooja 9892124323 ✓Call Girls In Mira Road ( Mumbai ) secure service,Call US Pooja 9892124323 ✓Call Girls In Mira Road ( Mumbai ) secure service,
Call US Pooja 9892124323 ✓Call Girls In Mira Road ( Mumbai ) secure service,
 

Swift in SwiftUI