gpt4 book ai didi

swift - 如何在父类(super class)中定义一个函数,该函数在 Swift 中进行子类化时将使用子类的类型?

转载 作者:行者123 更新时间:2023-11-28 13:34:06 25 4
gpt4 key购买 nike

我正在研究一种抽象,让我可以在一个表达式中创建一个对象并分配一些属性:

extension UIView {
func with(_ callback: (UIView) -> Void) -> UIView {
callback(self)
return self
}
}

像这样使用:

let greenView = UIView().with {
$0.backgroundColor = UIColor.green
}

问题是,当我子类化 UIView(在这种情况下)时,with 方法仍然想要处理 UIView 对象,而不是子类:

class SettingView: UIView {
let setting = UISwitch()
}

let activeSettingView = SettingView().with { (view: UIView) in
let settingView = view as! SettingView // this downcast is required
settingView.setting.isOn = true
}

有什么方法可以为 with 指定类型签名,以便它自动处理任何子类的类型,从而不再需要手动向下转换?即像这样:

let activeSettingView = SettingView().with { (view: SettingView) in
settingView.setting.isOn = true
}

我已经尝试研究泛型和协议(protocol)扩展,但还没有找到合适的东西。

最佳答案

这取决于 Swift 版本在 Swift 5.1 中,您可以在任何类中引用 Self,因此只需将 UIView 替换为 Self

在 Swift < 5.1 中,唯一的方法是创建这样的协议(protocol)

protocol Transformable {}

extension Transformable {
func with(_ callback: (Self) -> Void) -> Self {
callback(self)
return self
}
}

extension UIView: Transformable {}

那么它应该可以工作了

使用这个协议(protocol)你可以扩展任何类,但是会遇到改变结构的问题

为了能够将其与类和结构一起使用,只需将 with 替换为以下

extension Transformable {
func with(_ callback: (inout Self) -> Void) -> Self {
var mutable = self
callback(&mutable)
return mutable
}
}

关于swift - 如何在父类(super class)中定义一个函数,该函数在 Swift 中进行子类化时将使用子类的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56911354/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com