Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Property Wrappersがもたらす新しいSwiftプログラミング / New Swi...
Search
darquro
September 06, 2019
Technology
3
1.6k
Property Wrappersがもたらす新しいSwiftプログラミング / New Swift programming with Property Wrappers
iOSDC Japan 2019 day1(2019/8/6) Track A LT 16:15
darquro
September 06, 2019
Tweet
Share
More Decks by darquro
See All by darquro
技術的負債を解消してくための組織づくり
darquro
1
930
Jailbreakと向き合おう
darquro
0
2.2k
ラクマでのSwiftUI導入方針とTips / Rakuma SwiftUI Introduction Policy and Tips
darquro
2
4.9k
Half modal comparision in iOS15
darquro
2
1.8k
2 Years Challenge as Engineering Manager in Rakuma
darquro
0
110
iOS View Class Design Basic
darquro
3
730
Swift 5 Exclusivity Enforcement
darquro
4
760
SDK連携を用いたAdMob活用法
darquro
1
990
ContributingSwift
darquro
0
78
Other Decks in Technology
See All in Technology
テストアーキテクチャ設計で実現する高品質で高スピードな開発の実践 / Test Architecture Design in Practice
ropqa
3
710
『AWS Distinguished Engineerに学ぶ リトライの技術』 #ARC403/Marc Brooker on Try again: The tools and techniques behind resilient systems
quiver
0
130
技術負債の「予兆検知」と「状況異変」のススメ / Technology Dept
i35_267
1
1k
Postmanを使いこなす!2025年ぜひとも押さえておきたいPostmanの10の機能
nagix
2
120
君も受託系GISエンジニアにならないか
sudataka
2
370
Developers Summit 2025 浅野卓也(13-B-7 LegalOn Technologies)
legalontechnologies
PRO
0
150
データ資産をシームレスに伝達するためのイベント駆動型アーキテクチャ
kakehashi
PRO
2
230
日経電子版 x AIエージェントの可能性とAgentic RAGによって提案書生成を行う技術
masahiro_nishimi
1
290
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
6
57k
これからSREになる人と、これからもSREをやっていく人へ
masayoshi
6
4.1k
Googleマップ/Earthが一般化した 地図タイルのイマ
mapconcierge4agu
1
200
ビジネスと現場活動をつなぐソフトウェアエンジニアリング~とあるスタートアッププロダクトの成長記録より~
mizunori
0
210
Featured
See All Featured
Agile that works and the tools we love
rasmusluckow
328
21k
Art, The Web, and Tiny UX
lynnandtonic
298
20k
Building Applications with DynamoDB
mza
93
6.2k
Git: the NoSQL Database
bkeepers
PRO
427
64k
Fashionably flexible responsive web design (full day workshop)
malarkey
406
66k
Building Better People: How to give real-time feedback that sticks.
wjessup
366
19k
A better future with KSS
kneath
238
17k
Why Our Code Smells
bkeepers
PRO
335
57k
How STYLIGHT went responsive
nonsquared
98
5.3k
4 Signs Your Business is Dying
shpigford
182
22k
Statistics for Hackers
jakevdp
797
220k
Building Adaptive Systems
keathley
40
2.4k
Transcript
Re:valua t ion https://fril.jp/ L ead & Delight User F
irst Ownership Fail Smart 1SPQFSUZ8SBQQFST͕ͨΒ͢ ৽͍͠4XJGUϓϩάϥϛϯά !J04%$+BQBO
J04&OHJOFFS 3BLVUFO JOD ϥΫϚ "CPVU.F EBSRVSP :VLJ,VSPEB
!EBSRVSP !EBSRVSP
1SPQFSUZ8SBQQFST
1SPQFSUZ8SBQQFST w "WBJMBCMF4XJGU w ϓϩύςΟΞΫηεʹԠͯ͡ڍಈΛXSBQ w ϓϩύςΟΠϯελϯε͝ͱʹσʔλΛอ࣋Մೳ w
ॳظԆ࣮ߦ
6TFS%FGBVMUT&YBNQMF @propertyWrapper struct UserDefault<T> { var wrappedValue: T
{ get { return UserDefaults.standard .object(forKey: key) as? T ?? defaultValue } set { UserDefaults.standard.set(newValue, forKey: key) } } }
6TFS%FGBVMUT&YBNQMF @propertyWrapper struct UserDefault<T> { let key: String
let defaultValue: T init(_ key: String, defaultValue: T) { self.key = key self.defaultValue = defaultValue UserDefaults.standard .register(defaults: [key: defaultValue]) } var wrappedValue: T { … } }
6TFS%FGBVMUT&YBNQMF struct Foo { @UserDefault("IS_LOGGED_IN", defaultValue: false) static
var isLoggedIn: Bool } Foo.isLoggedIn = true // UserDefaults.standard.object(forKey: "IS_LOGGED_IN") -> 1 Foo.isLoggedIn = false // UserDefaults.standard.object(forKey: "IS_LOGGED_IN") -> 0
6TFS%FGBVMUT&YBNQMF
4UBUF&YBNQMF struct LandmarkList: View { @State var showFavoriteOnly
= true var body: some View { NavigationView { List { Toggle(isOn: $showFavoriteOnly) { Text("Favorite Only") } … } … }
4UBUF&YBNQMF @propertyWrapper public struct State<Value> : DynamicProperty, BindingConvertible
{ …… /// The current state value. public var wrappedValue: Value { get nonmutating set } …… /// Produces the binding referencing this state value public var projectedValue: Binding<Value> { get } }
7BMJEBUJPO&YBNQMF @propertyWrapper struct Validate<Value> { var wrappedValue: Value?
var isValid: Bool { guard let value = wrappedValue else { return false } return validateion(value) } private let validateion: (Value) -> Bool private let messageClosure: (Value) -> String init(_ validation: @escaping (Value) -> Bool, message messageClosure: @escaping (Value) -> String) { self.validateion = validation self.messageClosure = messageClosure } }
7BMJEBUJPO&YBNQMF enum StringValidationType { case email case phoneNumber
var regex: String { switch self { case .email: return #"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\.[A-Za- z]{2,64}"# case .phoneNumber: return "^[0-9]{6,14}$" } } }
7BMJEBUJPO&YBNQMF extension Validate where Value == String {
init(_ type: StringValidationType) { self.init({ $0.range(of: type.regex, options: .regularExpression) != nil }, message: { "Error:\($0) does not match email" }) } }
7BMJEBUJPO&YBNQMF struct Foo { @Validate(.email) var email: String?
@Validate(.phoneNumber) var phoneNumber: String? var isValidAll: Bool { _email.isValid && _phoneNumber.isValid } } var foo = Foo() foo.email = "
[email protected]
" foo.phoneNumber = "09012341234" foo.isValidAll // -> "true"
நԽ
நԽ w ܧঝ w 1SPUPDPM w &YUFOTJPOT w
1SPQFSUZ8SBQQFST
நԽ 1SPQFSZ8SBQQFST ࣮ίετ ந 1SPUPDPM &YUFOTJPOT ܧঝ
ల ΞʔΩςΫνϟ ϑϨʔϜϫʔΫ σβΠϯύλʔϯ 044ϥΠϒϥϦ
·ͱΊ
·ͱΊ 1SPQFSUZ8SBQQFST w ΑΓநతʹػೳΛϓϩύςΟͷΈʹఏڙͰ͖Δ w ϘΠϥʔϓϨʔτͷলུʹͳΔ w !YYY@YYYYYYͱ͍ͬͨಠࣗͷγϯλοΫε
4XJGU&WPMVUJPO1SPQPTBM IUUQTHJUIVCDPNBQQMFTXJGUFWPMVUJPOCMPCNBTUFSQSPQPTBMTQSPQFSUZXSBQQFSTNE
5IBOLZPV