在UIViewController中,这段代码:
public override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
if let mainController = self.mainViewController{
return mainController.supportedInterfaceOrientations
}
return UIInterfaceOrientationMask.all
}
给出错误Method doesn't override any method from its superclass
我使用的是Xcode 8 beta 4,iOS部署目标是9.0,Use Legacy Swift Language Version
Build Settings
设置为否
我怎样才能将上面的代码转换为Swift 3?
答案 0 :(得分:75)
像这样:
override var supportedInterfaceOrientations : UIInterfaceOrientationMask {
......其余的就像你拥有它一样。
现在很多Cocoa方法都是属性,所以你将它们实现为覆盖计算变量。因此从种子3(或更早)移动到种子4的模式是:
将func
更改为var
删除()
将->
更改为:
这是因为计算变量有一个getter函数,所以你之前实现的函数只是变成了getter函数。这些是只读属性,因此您不需要设置器。
同样受影响的方法包括preferredStatusBarStyle
,prefersStatusBarHidden
,shouldAutorotate
,preferredInterfaceOrientationForPresentation
以及其他许多方法。在Objective-C标题中查找UIKIT_DEFINE_AS_PROPERTIES
。
从长远来看,您可以进行其他更改。例如,您可以添加一个setter(将您的实现划分为get
和set
函数),因此您可以将您的实现转换为存储属性的外观。例如:
private var _orientations = UIInterfaceOrientationMask.portrait
override var supportedInterfaceOrientations : UIInterfaceOrientationMask {
get { return self._orientations }
set { self._orientations = newValue }
}
所以现在你的代码有办法设置这个值。如果你在不同的时间返回不同的值,这可以使事情变得更加清晰。
有趣的是,此更改对现有的Objective-C代码没有直接影响,因为在Objective-C中,新属性声明@property(nonatomic, readonly) UIInterfaceOrientationMask supportedInterfaceOrientations;
通过与以前相同的方法得到满足:
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait;
}
原因在于,在Objective-C中,@property(readonly)
仅仅是一个相应的getter方法存在的承诺,而这正是这个方法的意义所在。但是在Swift中,编写Objective-C属性的getter方法的方法是通过属性,即通过实例变量。因此,只有Swift代码才会受到更改的影响:您必须将方法重写为属性。