一尘不染

supportedInterfaceOrientations方法不会覆盖其超类中的任何方法

swift

在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 VersionBuild Settings

如何将上面的代码转换为Swift 3?


阅读 676

收藏
2020-07-07

共1个答案

一尘不染

像这样:

override var supportedInterfaceOrientations : UIInterfaceOrientationMask {

…还有其余的。

一般模式

现在,许多Cocoa方法都是属性,因此您可以将它们实现为重写计算变量。因此,从种子3(或更早)移动到种子4的模式是:

  • 更改funcvar

  • 删除 ()

  • 更改->:

之所以可行,是因为计算的变量具有getter函数,因此您之前实现的函数只是变成了getter函数。这些是只读属性,因此您不需要设置器。

同样受影响的方法是preferredStatusBarStyleprefersStatusBarHiddenshouldAutorotatepreferredInterfaceOrientationForPresentation,和其他许多人。UIKIT_DEFINE_AS_PROPERTIES在Objective-
C标头中查找。

含义

从长远来看,您还可以进行其他更改。例如,您 可以
添加一个setter(将实现划分为getset功能),从而可以将实现变成存储属性的外观。例如:

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中,a
@property(readonly)只是一个承诺,即存在相应的getter方法,而这正是该方法的含义。但是在Swift中,编写Objective-
C属性的getter方法的方法是通过 属性 ,即通过实例变量。因此,只有Swift代码受更改的影响:您必须将方法重写为属性。

2020-07-07