Ios Swift高级-在运行时设置扩展

Ios Swift高级-在运行时设置扩展,ios,swift,Ios,Swift,在Swift中是否有方法在运行时设置扩展 我得到了一个名为“CuteProtocol”的协议和该协议的扩展名为“CuteExtension”。当我想将此扩展添加到类中时,我只需执行以下操作: class CuteClass: UIViewController, CuteProtocol { } let cuteClass = CuteClass() cuteClass. // ADD EXTENSION-PROTOCOL SOMEHOW HERE. 然而,我有很多应该实现这个协议的类,我不

在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.

您不能在运行时设置扩展,但也不必在类定义中设置它们。您可以像这样扩展类:

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中回答这个问题。答案已经做出。