2017-09-23 2 views
1

Ich habe einige Schwierigkeiten, meine spezifische Anfrage in Swift zu verstehen. Es gibt eine Klasse namens Origin und mehrere Unterklassen. Wie kann ich meine Block-Methode NUR in der Origin-Klasse aktualisieren?Extrahieren Selbsteigenschaften in Block-Methode

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

brauche ich mod aus allen Origin Subklassen verwenden, und ich brauche diese Nutzungs Wirkung haben:

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

Also, Sie sehen, ich brauche in mod-Block OriginSubclass Eigenschaften extrahieren für die Verwendung. Ich muss im Verwendungs-Effekt-Code genau die Verwendung von Likes erstellen (die Eigenschaften des Mod-Callers von "."). Vielen Dank für Hilfe!

+0

Ihre Frage ist unklar. – rmaddy

+0

Vergleichen Sie https://Stackoverflow.com/a/42356615/2976878 – Hamish

Antwort

0

Sie könnten ein Protokoll mit einer Standardimplementierung berücksichtigen, zB:

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

Und dann:

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

Oder

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

Oder, wenn die Basisklasse ist nur dort für die mod Methode könnten Sie es vollständig verlieren:

protocol Modifiable { } 

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

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

Und

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

Oder

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