例如,在Objective-C中,如果苹果在UIView中添加了名为method1
的新方法,那么已经发布到App Store并使用以下代码的现有应用程序可能会崩溃或出现意外行为:
// Objective-C
@interface MyView : UIView
- (void)method1;
@end
// Swift
class MyView : UIView {
func method1() {
// do something
}
}
但在Swift中,要覆盖一个方法,需要一个override
关键字来防止意外覆盖。如果重写不带override
关键字的方法,编译器将生成编译时错误
如果苹果在下一个iOS版本中添加新的API方法,如果我的应用程序或你的应用程序使用与新API名称相同的方法,会发生什么
在Swift中,新的API方法会被Objective-C等现有应用程序中的方法覆盖吗
或者,由于Swift的显式重写功能(override
关键字),新的API不会影响现有的同名用户定义方法
如果你的应用程序已经构建并上传了,那么你就不会有问题。
但是,如果你试图为新的更新重新构建应用程序,但运气不好,他们将一个新的Api方法命名为与你的Object方法相同的名称,那么你可能会遇到的错误很可能是,只有当你使用该方法的地方没有使用正确的标识符,比如不调用self.method1(),只调用method1(,其恰好具有新方法1。
除此之外,我不会担心会发生这种问题,至少在我为iOS编程的3-4年里,我没有遇到过这样的问题。
//Lets assume UIViewController has a new Method in the Api now which
//they updated called Method1
class MyViewController :UIViewController {
init {
//When you try to re-build your app this line of code right here would complain
//because of ambiguity, two methods called the same one from your
//Parent Class and your own Class.
//method1()
//"super.method1()" or code below to solve the ambiguity issue.
self.method1()
}
//Added this just because I happen to use UIViewController.
override viewDidLoad() {
super.viewDidLoad()
}
//Your own method without Override, since you want to use your own method.
func method1() {
//Does something important
}
}
根据您的评论更新:
1) 有关于它的文档吗?或者你自己在Swift中测试过吗?
我自己测试过,因为我在应用商店里有应用程序。因此,无论已经上传了什么,代码都会起作用,因为你上传的应用程序预先打包了框架及其当前工作的Api和你的类。不,我没有看到关于它的文档,我知道它是因为我亲眼看到了它
2) 我认为如果UIViewController已经有func method1(),那么你就不能在没有override关键字的情况下定义func method 1()
这是正确的!假设APi已经有了一个方法,那么你就有了writeOverride关键字,可以使用相同名称的函数。但请记住,根据您的场景,您提到API在您已经将项目上传到AppStore之后创建了该名称的方法。因此,问题只有在进行一些新的编码并尝试重建应用程序时才会出现。