Как исправить «Невозможно переопределить самовозвратный тип несобственным типом возврата» после обновления XCode - PullRequest
2 голосов
/ 28 марта 2019

Я пытаюсь создать приложение iOS AWS и у меня возникли некоторые проблемы.

Я только что обновил Xcode до версии 10.2 и создал новый проект. Я нахожусь в точке, где я пытаюсь установить зависимости с CocoaPods для аутентификации пользователя. После изменения моего подфайла для включения 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.

Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

3 голосов
/ 29 марта 2019

В качестве временного решения сделайте класс метода final. Например, теперь AWSMobileClient:

public class AWSMobileClient: _AWSMobileClient {

Изменить на это:

public final class AWSMobileClient: _AWSMobileClient {

А затем дождитесь исправлений AWS.

3 голосов
/ 30 марта 2019

Мы столкнулись с этой проблемой, но не решались редактировать AWSMobileClient напрямую.

Установка версии Swift Language на 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, больше не может быть переопределен методом, возвращающим неконечный конкретный тип класса. Такой код не является безопасным по типу и должен быть обновлен.

2 голосов
/ 28 марта 2019

Как показывает ошибка, вам нужно вернуть 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.

Однако это очень странное переопределение. Непонятно, чего пытается достичь этот код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...