potatotips #66 (iOS/Android開発Tips共有会) - connpass https://potatotips.connpass.com/event/149806/
11/11 23:07 ObservedObject の説明を加筆しました
SwiftUI ͷ@State, @ObservedObject,@EnvironentObject2019/11/11 potatotips #66twitter.com/kumamo_tone
View Slide
• iOS/AndroidΤϯδχΞˏϠϑʔ• ษڧձӡӦ• Bonfire iOSɺWWDC Extended ͳͲ• ࠷ۙࣾ༻ͷΞϓϦΛSwiftUIͰ࡞Γ·ͨ͠۽ຊ ਖ਼ (@kumamo_tone)
SwiftUIiOS13Ͱొͨ͋ͨ͠Β͍͠ϑϨʔϜϫʔΫએݴతʹUIΛهड़Ͱ͖Δ
struct ContentView: View {@State var isOn: Boolvar body: some View {Toggle(isOn: $isOn) {if self.isOn {Text("On")} else {Text("Off")}}.frame(width: 200)}}#PPMܕͷϓϩύςΟ
struct ContentView: View {@State var isOn: Boolvar body: some View {Toggle(isOn: $isOn) {if self.isOn {Text("On")} else {Text("Off")}}.frame(width: 200)}}#PPMܕͷϓϩύςΟ7JFXΛએݴ#PPMͷঢ়ଶ͕มΘΔͱɺউखʹมΘΔ
struct ContentView: View {@State var isOn: Boolvar body: some View {Toggle(isOn: $isOn) {if self.isOn {Text("On")} else {Text("Off")}}.frame(width: 200)}}#PPMܕͷϓϩύςΟ7JFXΛએݴ#PPMͷঢ়ଶ͕มΘΔͱɺউखʹมΘΔ!4UBUF͕͍͍ͭͯΕ
• @State• @ObservedObject• @EnvironentObjectView Binding༻ͷProperty WrappersProperty Wrappersʹ͍ͭͯͷ͘Θ͍͠આ໌ɺҎલεϥΠυʹ·ͱΊͨͷͰΑ͔ͬͨΒࢀߟʹ͍ͯͩ͘͠͞
@State
@State• ͍ͪΜجຊతͳόΠϯσΟϯάํ๏
struct ContentView: View {@State var isOn: Boolvar body: some View {Toggle(isOn: $isOn) {if self.isOn {Text("On")} else {Text("Off")}}.frame(width: 200)}}͜ͷϓϩύςΟͷมߋ͕ݕͰ͖ΔΑ͏ʹͳΔ
@State ͷಛ• ੍ݶ• એݴͨ͠ViewͱͦͷࢠViewͰ͔͔ͭ͑͠ͳ͍• Viewʹ͕ؔ͋ΔʢͰ͖ΕʣprivateͳϓϩύςΟʹ͔ͭ͏• Toggleͷঢ়ଶ• TabViewͷબঢ়ଶ,• ButtonͷisEnabledɹͳͲ
@ObservedObject
• ࣗ࡞Ϋϥεͷঢ়ଶΛόΠϯσΟϯά͢Δ͜ͱ͕Ͱ͖Δ@ObservedObject
struct ContentView: View {@State var userFirstName: String@State var userLastName: String}
struct ContentView: View {@State var user: User}struct ContentView: View {@State var userFirstName: String@State var userLastName: String}ʢTUSVDUʹͨ͠߹ʣϓϩύςΟͷมߋ͕͋ΔͱɺશମΛஔ͖͑Δඞཁ͕͋ΔͨΊɺDMBTTʹ͍ͨ͠ͱ͖͕͋Δ
struct ContentView: View {@State var user: User}struct ContentView: View {@State var userFirstName: String@State var userLastName: String}ʢDMBTTʹͨ͠߹ʣVTFSͷมߋݕͰ͖Δ͕ɺVTFSpSTU/BNFͷมߋݕͰ͖ͳ͍
struct ContentView: View {@ObservedObject var user: User}struct ContentView: View {@State var userFirstName: String@State var userLastName: String}
class User: ObservableObject {@Published var userFirstName: String@Published var userLastName: String}ద߹͢Δͱ!0CTFSWFE0CKFDUͱͯ͑͠Δ
class User: ObservableObject {@Published var userFirstName: String@Published var userLastName: String}ద߹͢Δͱ!0CTFSWFE0CKFDUͱͯ͑͠Δ!1VCMJTIFEΛ͚ͭΔͱมߋΛݕͰ͖ΔΑ͏ʹͳΔ
• ͍Ͳ͜Ζ• Viewʹؔ͢ΔclassʢViewModelͳͲʣΛͻͱ·ͱΊʹ͍ͨ͠ͱ͖@ObservedObject ͷಛ
@EnvironmentObject
class GameSettings: ObservableObject {@Published var isHard: Bool = false}
struct ContentView: View {@ObservedObject var settings: GameSettings = GameSettings()var body: some View {NavigationView {List {NavigationLink(destination:NextView(settings: self.settings)) {Text("\(settings.isHard ? "Hard" : "Easy")")}}}}}struct NextView: View {@ObservedObject var settings: GameSettingsvar body: some View {Toggle(isOn: $settings.isHard) {self.settings.isHard ? Text("Hard") : Text("Easy")}}}ભҠઌͷ7JFXΛ ࢦఆ
struct ContentView: View {@ObservedObject var settings: GameSettings = GameSettings()var body: some View {NavigationView {List {NavigationLink(destination:NextView(settings: self.settings)) {Text("\(settings.isHard ? "Hard" : "Easy")")}}}}}struct NextView: View {@ObservedObject var settings: GameSettingsvar body: some View {Toggle(isOn: $settings.isHard) {self.settings.isHard ? Text("Hard") : Text("Easy")}}}ΠχγϟϥΠβʹ͢
UIHostingController(rootView: ContentView().environmentObject(GameSettings()))&OWJSPONFOUʹొ
• EnvironmentʢViewؒͰڞ༗͢ΔγϯάϧτϯͷΑ͏ͳͷʣ ʹొ͞Ε͍ͯΔใΛऔΓग़͢@EnvironmentObject
struct ContentView: View {@ObservedObject var settings: GameSettings = GameSettings()var body: some View {NavigationView {List {NavigationLink(destination:NextView(settings: self.settings)) {Text("\(settings.isHard ? "Hard" : "Easy")")}}}}}struct NextView: View {@ObservedObject var settings: GameSettingsvar body: some View {Toggle(isOn: $settings.isHard) {self.settings.isHard ? Text("Hard") : Text("Easy")}}}
struct ContentView: View {@EnvironmentObject var settings: GameSettingsvar body: some View {NavigationView {List {NavigationLink(destination:NextView()) {Text("\(settings.isHard ? "Hard" : "Easy")")}}}}}struct NextView: View {@EnvironmentObject var settings: GameSettingsvar body: some View {Toggle(isOn: $settings.isHard) {self.settings.isHard ? Text("Hard") : Text("Easy")}}}Կ͞ͳͯ͘Α͍
• ͍Ͳ͜Ζʢओ؍ʣ• ΞϓϦશମͰ͏ใͳͲɺ ΠχγϟϥΠβͰ͍ͯ͘͠ͷ͕ΊΜͲ͍͘͞ͱ͖@EnvironmentObject ͷಛ
·ͱΊ
• @State• ϓϩύςΟΛόΠϯσΟϯάͰ͖Δ• @ObservedObject• ࣗ࡞ΫϥεΛόΠϯσΟϯάͰ͖Δ• όΠϯσΟϯά͢ΔPropertyʹ@PublishedΛ͚ͭΔ• @EnvironentObject• ΠχγϟϥΠβܦ༝ͰViewؒͷσʔλͷड͚͕͠Ͱ͖Δ• @EnvironentObject Ͱ Environment ܦ༝Ͱड͚͕͠Ͱ͖Δ·ͱΊ
• What's New in Swift• https://developer.apple.com/videos/play/wwdc2019/402/• SwiftUIͷProperty WrappersͱσʔλͷΞΫηεํ๏• https://qiita.com/shiz/items/6eaf87fa79499623306aReferences