2017-09-23 94 views
1

在Swift中我理解我的具體請求時遇到了一些麻煩。 有一個名爲Origin的類和多個它的子類。 我如何更新我在原始類中編寫的塊方法?在塊方法中提取自我屬性

class Origin: NSObject { 
    func mod(_ block: (() throws -> Void)) { 
     try! block() 
    } 
} 

我需要使用國防部所有產地的子類,我需要有這樣的使用效果:

var originSubclassObject = OriginSubclass() 
originSubclassObject.mod { 
    .age = 12 //age is OriginSubclass property 
    .name = "Bob" //name is OriginSubclass property 
} 

所以,你看,我需要使用模塊提取OriginSubclass性能。我需要在使用效果代碼中精確地創建使用情況(從「。」中提取mod-caller屬性)。 謝謝大家的幫助!

+0

你的問題還不清楚。 – rmaddy

+0

比較https://stackoverflow.com/a/42356615/2976878 – Hamish

回答

0

你可以考慮使用一個默認實現的協議,如:

protocol Modifiable { } 

extension Modifiable { 
    func mod(_ block: ((Self) throws -> Void)) { 
     try! block(self) 
    } 
} 

class Origin: Modifiable { } 

class OriginSubclass: Origin { 
    var name: String? 
    var age: Int? 
} 

然後:

let originSubclassObject = OriginSubclass() 
originSubclassObject.mod { object in 
    object.age = 12 
    object.name = "Bob" 
} 

或者

let originSubclassObject = OriginSubclass() 
originSubclassObject.mod { 
    $0.age = 12 
    $0.name = "Bob" 
} 

或者,如果基類是隻有在那裏對於mod方法,您可能會完全丟失它:

protocol Modifiable { } 

extension Modifiable { 
    func mod(_ block: ((Self) throws -> Void)) { 
     try! block(self) 
    } 
} 

class MyObject: Modifiable { 
    var name: String? 
    var age: Int? 
} 

而且

let myObject = MyObject() 
myObject.mod { object in 
    object.age = 12 
    object.name = "Bob" 
} 

或者

let myObject = MyObject() 
myObject.mod { 
    $0.age = 12 
    $0.name = "Bob" 
}