Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class SomeModel : Printable {
- var a:String
- init(a:String) {
- self.a = a
- }
- var description:String {
- return "(self.a)"
- }
- }
- class Editor {
- var getter:()-> String
- var setter:(String)->()
- init(getter:()-> String, setter:(String)->()) {
- self.getter = getter
- self.setter = setter
- }
- convenience init(inout bindTo:String) {
- self.init(
- getter:{ return bindTo },
- setter: { v in bindTo = v })
- }
- func read() -> String {
- return self.getter()
- }
- func write(value:String) {
- self.setter(value)
- }
- }
- func testBindTo() {
- var readModel = SomeModel(a:"Did not capture by reference");
- var bindForReading = Editor(bindTo: &readModel.a)
- readModel.a = "captured by reference!"
- println(bindForReading.read())
- var writeModel = SomeModel(a:"Did not capture by reference");
- var bindForWriting = Editor(bindTo: &writeModel.a)
- bindForWriting.write("captured by reference")
- println(writeModel)
- }
- testBindTo()
- func testExplicitGetterSetter() {
- var readModel = SomeModel(a:"Did not capture by reference");
- var bindForReading = Editor(
- getter: { readModel.a },
- setter: { v in readModel.a = v })
- readModel.a = "captured by reference!"
- println(bindForReading.read())
- var writeModel = SomeModel(a:"Did not capture by reference");
- var bindForWriting = Editor(
- getter: { writeModel.a },
- setter: { v in writeModel.a = v })
- bindForWriting.write("captured by reference")
- println(writeModel)
- }
- testExplicitGetterSetter()
- Did not capture by reference
- Did not capture by reference
- captured by reference!
- captured by reference
- /// A class providing access to a resource with an inout parameter in an escaping closure.
- class ProtectedResource<ValueType> {
- private var protectedResourceArray = [ValueType]()
- private var protectedResourceArrayLock = NSRecursiveLock()
- private let opq = OperationQueue()
- func performWithResource(block: @escaping (inout [ValueType]) -> ()) {
- opq.addOperation { [weak self] in
- guard let strongSelf = self else {
- return
- }
- strongSelf.protectedResourceArrayLock.lock()
- block(&strongSelf.protectedResourceArray)
- strongSelf.protectedResourceArrayLock.unlock()
- }
- }
- }
- /// Some other class using that in out parameter.
- func run() {
- func updateArray(array: inout [String]) {
- print("Performing on (array)")
- array.append("test")
- }
- protectedResource.performWithResource(block: updateArray)
- protectedResource.performWithResource {
- print("Performing on ($0)")
- }
- }
Add Comment
Please, Sign In to add comment