【问题标题】:Extract self-properties in block-method在块方法中提取自身属性
【发布时间】:2023-03-11 13:31:01
【问题描述】:

我在 Swift 中无法理解我的具体要求。 有一个名为 Origin 的类及其多个子类。 如何更新仅在 Origin 类中编写的块方法?

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

我需要使用所有Origin子类的mod,我需要有这个使用效果:

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

所以,你看,我需要提取 OriginSubclass 属性以便在 mod-block 中使用。我需要在使用效果代码中创建与使用完全相同的用法(从“。”中提取 mod-caller 属性)。 感谢大家的帮助!

【问题讨论】:

标签: swift properties block subclassing


【解决方案1】:

您可以考虑使用默认实现的协议,例如:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-20
    • 1970-01-01
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    • 2014-10-27
    相关资源
    最近更新 更多