Last active
December 27, 2021 08:27
-
-
Save apple-avadhesh/aac12e7fe35dc5f7ab2b3fc29ce463e0 to your computer and use it in GitHub Desktop.
Struct Chain Calls
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Approach 1 - [https://stackoverflow.com/a/70492824/6576315] | |
struct Employee { | |
var name: String? | |
var designation: String? | |
func name(_ name: String) -> Employee { | |
.init(name: name, designation: self.designation) | |
} | |
func designation(_ designation: String) -> Employee { | |
.init(name: self.name, designation: designation) | |
} | |
} | |
// Approach 2 - https://stackoverflow.com/a/62350778/6576315 | |
// Approach 3 - Dynamic Member Lookup | |
@dynamicMemberLookup | |
struct Setter<Subject> { | |
let subject: Subject | |
subscript<Value>(dynamicMember keyPath: WritableKeyPath<Subject, Value>) -> ((Value) -> Setter<Subject>) { | |
var subject = self.subject | |
return { value in | |
subject[keyPath: keyPath] = value | |
return Setter(subject: subject) | |
} | |
} | |
} | |
struct Employee { | |
var name: String? | |
var designation: String? | |
} | |
let emp = Setter(subject: Employee()) | |
.designation("iOS Engineer") | |
.name("Speedy") | |
.subject | |
print(emp.designation) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment