2017-09-23 9 views
1

J'ai quelques difficultés à comprendre ma requête spécifique, dans Swift. Il existe une classe nommée Origine et plusieurs de ses sous-classes. Comment puis-je mettre à jour ma méthode de bloc écrite SEULEMENT dans la classe Origin?Extraire des auto-propriétés en méthode de bloc

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

J'ai besoin d'utiliser mod de toutes les sous-classes d'origine, et je dois avoir cet effet d'utilisation:

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

Donc, vous voyez, je dois extraire les propriétés OriginSubclass pour l'utilisation en bloc mod. J'ai besoin de créer exactement l'usage dans le code d'effet d'utilisation (extraire les propriétés de mod-caller de "."). Merci à tous pour votre aide!

+0

Votre question est claire. – rmaddy

+0

Comparez https://stackoverflow.com/a/42356615/2976878 – Hamish

Répondre

0

Vous pourriez envisager un protocole avec une implémentation par défaut, par exemple:

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? 
} 

Et puis:

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

Ou

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

Ou, si cette classe de base était seulement là pour la méthode mod, vous pourriez le perdre entièrement:

protocol Modifiable { } 

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

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

Et

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

Ou

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