在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
Method doesn't override any method from its superclass
我正在使用Xcode 8 beta 4,且iOS部署目标是9.0,并且Use Legacy Swift Language Version在Build Settings
Use Legacy Swift Language Version
Build Settings
如何将上面的代码转换为Swift 3?
像这样:
override var supportedInterfaceOrientations : UIInterfaceOrientationMask {
…还有其余的。
现在,许多Cocoa方法都是属性,因此您可以将它们实现为重写计算变量。因此,从种子3(或更早)移动到种子4的模式是:
更改func为var
func
var
删除 ()
()
更改->为:
->
:
之所以可行,是因为计算的变量具有getter函数,因此您之前实现的函数只是变成了getter函数。这些是只读属性,因此您不需要设置器。
同样受影响的方法是preferredStatusBarStyle,prefersStatusBarHidden,shouldAutorotate,preferredInterfaceOrientationForPresentation,和其他许多人。UIKIT_DEFINE_AS_PROPERTIES在Objective- C标头中查找。
preferredStatusBarStyle
prefersStatusBarHidden
shouldAutorotate
preferredInterfaceOrientationForPresentation
UIKIT_DEFINE_AS_PROPERTIES
从长远来看,您还可以进行其他更改。例如,您 可以 添加一个setter(将实现划分为get和set功能),从而可以将实现变成存储属性的外观。例如:
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;可以通过与以前相同的方法来满足:
@property(nonatomic, readonly) UIInterfaceOrientationMask supportedInterfaceOrientations;
- (UIInterfaceOrientationMask)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; }
原因是在Objective-C中,a @property(readonly)只是一个承诺,即存在相应的getter方法,而这正是该方法的含义。但是在Swift中,编写Objective- C属性的getter方法的方法是通过 属性 ,即通过实例变量。因此,只有Swift代码受更改的影响:您必须将方法重写为属性。
@property(readonly)