Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Property Wrappersがもたらす新しいSwiftプログラミング / New Swi...
Search
darquro
September 06, 2019
Technology
1.8k
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
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
More Decks by darquro
See All by darquro
技術的負債を解消してくための組織づくり
darquro
1
1.1k
Jailbreakと向き合おう
darquro
0
3.1k
ラクマでのSwiftUI導入方針とTips / Rakuma SwiftUI Introduction Policy and Tips
darquro
2
5.7k
Half modal comparision in iOS15
darquro
2
3.1k
2 Years Challenge as Engineering Manager in Rakuma
darquro
0
170
iOS View Class Design Basic
darquro
3
880
Swift 5 Exclusivity Enforcement
darquro
4
930
SDK連携を用いたAdMob活用法
darquro
1
1.1k
ContributingSwift
darquro
0
120
Other Decks in Technology
See All in Technology
Azure Copilot Resiliency Agentをいろいろ試してみる
tomokusaba
0
140
あなたの知らないAmazon VPC Route Server/Amazon VPC Route Server you don't know about
masakiokuda
0
150
AIは推し活である。
kurazuuuuuu
2
1k
Oracle Cloud Infrastructure(OCI):Onboarding Session(はじめてのOCI/Oracle Supportご利⽤ガイド)
oracle4engineer
PRO
3
21k
[Kiro Meetup #7] Kiro Crew Dive Deep
konippi
0
420
AIに会社の文脈を理解させる技術~上流工程・非エンジニアにも広げるハーネスエンジニアリング実践~
ochtum
0
190
Amazon Bedrock Agents ClassicからAmazon Bedrock AgentCoreへ移行した際、ガードレール設定が2箇所に割れた話
matsunobu
0
160
企業の現実世界をグラフで写し取る
sansantech
PRO
0
200
顧客の成果創出とプロダクトの成長を 両立するためのFDE
sansantech
PRO
0
470
ボードゲームの遊び相手をFoundation Modelsで作る / iOSDC Japan 2026
genda
0
230
覗いてみよう 関数型ビジュアル言語×2Dグラフィックスの世界
yohyamasaki
0
150
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
16
120k
Featured
See All Featured
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.4k
sira's awesome portfolio website redesign presentation
elsirapls
0
430
Prompt Engineering for Job Search
mfonobong
0
460
Paper Plane
katiecoart
PRO
4
53k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
18k
Docker and Python
trallard
47
4.2k
Building the Perfect Custom Keyboard
takai
2
890
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
600
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
850
Claude Code のすすめ
schroneko
67
230k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.8k
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