2

我正在尝试构建 iOS AWS 应用程序,但遇到了一些问题。

我刚刚将 Xcode 更新到 10.2 版并创建了一个全新的项目。我正试图使用​​ CocoaPods 安装依赖项以进行用户身份验证。在修改我的 podfile 以包含 AWSMobileClient (并pod install --repo-update按照 AWS 文档所述运行)后,我在此函数的 AWSMobileClient.swift 中收到构建错误:

@objc override public class func sharedInstance() -> AWSMobileClient {
   return _sharedInstance
}

错误是这样说的:

Cannot override a Self return type with a non-Self return type

我被困在这里了,我现在唯一能想到的就是回到 Xcode 10.1。

任何帮助将不胜感激。

4

3 回答 3

4

作为临时解决方案,使方法的类成为最终的。例如 AWSMobileClient 现在是:

public class AWSMobileClient: _AWSMobileClient {

改变这个:

public final class AWSMobileClient: _AWSMobileClient {

然后等待 AWS 修复。

于 2019-03-29T15:52:05.737 回答
3

我们遇到了这个问题,但对直接编辑 AWSMobileClient 犹豫不决。

将项目和目标的 Swift 语言版本设置为 4.2,并在 Pod 文件中指定:

post_install do |installer|
    installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings['SWIFT_VERSION'] = '4.2'
        end
    end
end

为我们工作以允许再次建造。作为它的 Swift 5 兼容性问题:

SR-695

在 Swift 5 模式下,返回 Self 的类方法不能再被返回非最终具体类类型的方法覆盖。此类代码不是类型安全的,需要更新。

于 2019-03-29T22:11:26.723 回答
2

Self如错误所示,如果类不是最终类,则需要在此处返回。

@objc override public class func sharedInstance() -> Self { return _sharedInstance }

(这是假设它_sharedInstance是类型Self。)

或者,您可以将超类修改为不返回Self,而是返回特定类型(可能是它自己的类型)。

@objc public class func sharedInstance() -> TheActualClass { return _sharedInstance }

(在这种情况下,所有子类都需要返回 TheActualClass。我假设该类是 AWSMobileClient。)

由于这是一个框架,我希望供应商能够解决这个问题,并且我会确保您运行的是最新版本的框架。

Self表示此方法返回被调用类的类型的值。所以如果你有SomeClass.sharedInstance()必须返回一个SomeClass. 但是,如果您将其子类化,则调用SubClass.sharedInstance()必须返回一个SubClass. 如果你不能做到这一点,你将需要做一些最终的事情,或者不返回Self

然而,这是一个非常奇怪的覆盖。目前尚不清楚这段代码试图实现什么。

于 2019-03-28T19:31:12.397 回答