try! Swift Pre Talks でお話ししました登壇資料です @tamappe
-FU`TVTF%ZOBNJD.FNCFS-PPLVQJOUSPEVDFEJO4XJGU!UBNBQQFUSZ4XJGU1SF5BMLT
View Slide
struct Me {let name = “Yosuke Tamaoki”let age = 31let company = “Summer" + “Freelance“let os = "iOS" + "Android"let hobby = "Splatoon2" + “Poker"struct Language {let swiftlet objective-clet javalet kotlin}}"CPVU!UBNBQQF
1PXFSPGEZOBNJDNFNCFSMPPLVQ)PXUP*NQMFNFOU4BNQMFDPEFT$PODMVTJPO4VNNBSZPGNZUBML!EZOBNJD.FNCFS-PPLVQQSPUPDPM\^
// Dictionarylet classRoom: [String: Any] = ["teacher": "Yamada",“studentNum”: 30]// beforelet teacher = classRoom["teacher"] // "Yamada"let count = classRoom["studentNum"] // 30let teacher = classRoom.teacher // compile errorlet count = classRoom.studentNum // compile error// afterlet teacher = classRoom.teacher // "Yamada"let count = classRoom.studentNum // 301PXFSPGEZOBNJDNFNCFSMPPLVQ
"EE!EZOBNJD.FNCFS-PPLVQCFGPSFUIFDMBTT"EElTVCTDSJQUzEFpOJUJPO"EEMBCFMEZOBNJD.FNCFSUPUIFBSHVNFOUPGTVCTDSJQUEFpOJUJPO)PXUP*NQMFNFOU
4BNQMFDPEF$MBTT4USVDU1SPUPDPM&OVN&YQMBJO&YQMBJOTMJEFPOMZTMJEFPOMZ
$MBTTDBTF@dynamicMemberLookupclass User {let firstName: Stringlet lastName: Stringlet age: Intinit(firstName: String, lastName: String, age: Int) {self.firstName = firstNameself.lastName = lastNameself.age = age}subscript(dynamicMember key: String) -> Any {switch key {case "upperFirstName":return firstName.uppercased()case "upperLastName":return lastName.uppercased()case "adalt":return 30case "children":return 15default:return ""}}}
6TFDBTFlet hanakoYamada = User(firstName: "Hanako",lastName: "Yamada",age: 20)print(hanakoYamada.firstName) // "Hanako"print(hanakoYamada.lastName) // "Yamada"print(hanakoYamada.age) // 20print(hanakoYamada.upperFirstName) // "HANAKO"print(hanakoYamada.upperLastName) // "YAMADA"print(hanakoYamada.adalt) // 30print(hanakoYamada.children) // 15print(hanakoYamada.young) // ""
TUSVDUDBTF@dynamicMemberLookupstruct Person {subscript(dynamicMember name: String) -> String {return "Hello, \(name)"}}
6TFDBTFlet person = Person()print(person.swift) // "Hello, swift”print(person.hanako) // "Hello, hanako”print(person.taro) // "Hello, taro"
5IBU`T"MM5IBOLZPVhttps://blog.tamappe.com
1SPUPDPMDBTF@dynamicMemberLookupprotocol SampleProtocol {associatedtype Keyassociatedtype Valuesubscript(key: Key) -> Value? { get }}extension SampleProtocol where Key == String {subscript(dynamicMember member: String) -> Value? {return self[member]}}extension Dictionary: SampleProtocol {}1SPUPDPMFYUFOTJPO
6TFDBTFlet hanakoDic: [String : Any] = ["firstName": "hanako","lastName": "yamada","age": 20]print(hanakoDic.firstName as! String) // “hanako"print(hanakoDic.age as! Int) // 20
&OVNDBTF@dynamicMemberLookupenum JSON {case number(Int)case string(String)case array([JSON])case dictionary([String: JSON])subscript(dynamicMember key: String) -> JSON? {guard case .dictionary(let dict) = self else {return nil}return dict[key]}}extension JSON {var numberValue: Int? {guard case .number(let n) = self else {return nil}return n}var stringValue: String? {guard case .string(let s) = self else {return nil}return s}subscript(index: Int) -> JSON? {guard case .array(let arr) = self,arr.indices.contains(index) else{return nil}return arr[index]}subscript(key: String) -> JSON? {guard case .dictionary(let dict) = self else {return nil}return dict[key]}}+40/
&OVNDBTF@dynamicMemberLookupenum JSON {case number(Int)case string(String)case array([JSON])case dictionary([String: JSON])subscript(dynamicMember key: String) -> JSON? {guard case .dictionary(let dict) = self else {return nil}return dict[key]}}+40/
&OVNDBTFextension JSON {var numberValue: Int? {guard case .number(let n) = self else {return nil}return n}var stringValue: String? {guard case .string(let s) = self else {return nil}return s}subscript(index: Int) -> JSON? {guard case .array(let arr) = self,arr.indices.contains(index) else{return nil}return arr[index]}subscript(key: String) -> JSON? {guard case .dictionary(let dict) = self else {return nil}return dict[key]}}+40/
6TFDBTFlet json = JSON.dictionary(["firstName": .string("hanako"),"lastName": .string("Yamada"),"age": .number(20),"language": .array([.string(“Swift"),.string("Objective-c"),.string("Kotlin"),.string("Java"),])])if let firstName = json.firstName?.stringValue {print(firstName) // "hanako"}