Ios Swift高级-在运行时设置扩展
在Swift中是否有方法在运行时设置扩展 我得到了一个名为“CuteProtocol”的协议和该协议的扩展名为“CuteExtension”。当我想将此扩展添加到类中时,我只需执行以下操作:Ios Swift高级-在运行时设置扩展,ios,swift,Ios,Swift,在Swift中是否有方法在运行时设置扩展 我得到了一个名为“CuteProtocol”的协议和该协议的扩展名为“CuteExtension”。当我想将此扩展添加到类中时,我只需执行以下操作: class CuteClass: UIViewController, CuteProtocol { } let cuteClass = CuteClass() cuteClass. // ADD EXTENSION-PROTOCOL SOMEHOW HERE. 然而,我有很多应该实现这个协议的类,我不
class CuteClass: UIViewController, CuteProtocol {
}
let cuteClass = CuteClass()
cuteClass. // ADD EXTENSION-PROTOCOL SOMEHOW HERE.
然而,我有很多应该实现这个协议的类,我不想一个接一个地添加它们,我也不想创建一个基类
是否有一种方法可以在运行时设置扩展协议,如下所示:
class CuteClass: UIViewController, CuteProtocol {
}
let cuteClass = CuteClass()
cuteClass. // ADD EXTENSION-PROTOCOL SOMEHOW HERE.
您不能在运行时设置扩展,但也不必在类定义中设置它们。您可以像这样扩展类:
extension CuteClass: CuteProtocol {
// your code conforming to Cute Protocol goes here.
}
更新1
或者,如果希望将默认实现设置为CuteProtocol
,也可以扩展CuteProtocol
本身:
protocol CuteProtocol {
func f1()
}
extension CuteProtocol {
func f1() {
// default implementation
}
}
这样,如果希望更改或使用默认实现,每个类都可以更改f1
实现
您甚至可以添加条件扩展,如:
extension CuteProtocol where Self: CuteClass {
func f1() { }
func f2() { }
}
所以,如果您编写扩展CuteClass:CuteProtocol{}
所有CuteClass实例和子类都将有权访问方法f1
和f2
但是请注意,扩展中添加的函数在协议中定义时支持动态调度。
在我提供的示例中,f1
将使用动态调度调用,而f2
将使用静态调度调用。i、 e:如果CuteChildClass:CuteClass
更改了f2
实现,并且您从CuteProtocol
变量调用了f2
,则将调用您在扩展中提供的代码。您不能在运行时设置扩展,但也不必在类定义中设置它们。您可以像这样扩展类:
extension CuteClass: CuteProtocol {
// your code conforming to Cute Protocol goes here.
}
更新1
或者,如果希望将默认实现设置为CuteProtocol
,也可以扩展CuteProtocol
本身:
protocol CuteProtocol {
func f1()
}
extension CuteProtocol {
func f1() {
// default implementation
}
}
这样,如果希望更改或使用默认实现,每个类都可以更改f1
实现
您甚至可以添加条件扩展,如:
extension CuteProtocol where Self: CuteClass {
func f1() { }
func f2() { }
}
所以,如果您编写扩展CuteClass:CuteProtocol{}
所有CuteClass实例和子类都将有权访问方法f1
和f2
但是请注意,扩展中添加的函数在协议中定义时支持动态调度。
在我提供的示例中,f1
将使用动态调度调用,而f2
将使用静态调度调用。i、 e:如果CuteChildClass:CuteClass
更改了f2
实现,并且您从CuteProtocol
变量调用了f2
,则将调用您在扩展中提供的代码。否,但您可以扩展例如UIViewController或其他基类
extension UIViewController: CuteProtocol {
// your code conforming to Cute Protocol goes here.
}
不可以,但您可以使用扩展,例如UIViewController或其他基类
extension UIViewController: CuteProtocol {
// your code conforming to Cute Protocol goes here.
}
您可以在ObjC中自由使用运行时修饰符,但在Swift中,这种模式并不常见
注意:如果您感兴趣,您可以在中找到有关此的更多信息。您可以在ObjC中自由使用运行时修饰符,但在Swift中,这种模式并不常见
注意:如果您感兴趣,您可以在中找到有关此问题的更多信息。谢谢您的回答。但我并不是只有一个类必须实现CuteProtocol。所有这些类都是从一个地方创建的,我希望所有从那里创建的类在它们出生时都能实现这个协议。所以下一个开发人员不必知道必须实现CuteProtocol,它会自动实现。看来没有办法了。@asanli你也可以扩展CuteProtocol
本身。我会更新答案,希望能有所帮助。感谢更新后的答案,它将对人们有用。但是,我不使用CuteClass的实例。我和CuteClass、UglyClass和许多其他课程一起工作。我想找到一种方法,在运行时创建这些类的同时,为这些类实现CuteProtocol。原因是:我们从一个类创建所有这些新类,每个新类都必须实现CuteProtocol。下一个开发者不会知道这一点。所以,如果我能自动化CuteProtocol的实现,它将解决新创建的类的问题。谢谢你的回答。但我并不是只有一个类必须实现CuteProtocol。所有这些类都是从一个地方创建的,我希望所有从那里创建的类在它们出生时都能实现这个协议。所以下一个开发人员不必知道必须实现CuteProtocol,它会自动实现。看来没有办法了。@asanli你也可以扩展CuteProtocol
本身。我会更新答案,希望能有所帮助。感谢更新后的答案,它将对人们有用。但是,我不使用CuteClass的实例。我和CuteClass、UglyClass和许多其他课程一起工作。我想找到一种方法,在运行时创建这些类的同时,为这些类实现CuteProtocol。原因是:我们从一个类创建所有这些新类,每个新类都必须实现CuteProtocol。下一个开发者不会知道这一点。因此,如果我能自动实现CuteProtocol,它将解决新创建类的问题。你可以在ObjC中自由使用运行时修饰符,但在Swift中,这种模式并不常见(至少现在是这样)。请在@Holext中回答这个问题。答案已经给出。你可以在ObjC中自由使用运行时修饰符,但在Swift中,这种模式并不常见(至少现在是这样)。请在@Holext中回答这个问题。答案已经做出。