Невозможно переопределить функцию расширений в другом расширении - Swift 4 [duplicate]

Посмотрите на этот пример:

var app = angular.module('plunker', []);

app.controller('MainCtrl', function($scope,$http) {

    var getJoke = function(){
        return $http.get('http://api.icndb.com/jokes/random').then(function(res){
            return res.data.value;  
        });
    }

    getJoke().then(function(res) {
        console.log(res.joke);
    });
});

Как вы можете видеть, getJoke возвращает разрешенное обещание (оно разрешено при возврате res.data.value). Таким образом, вы ждете, пока запрос $ http.get не будет завершен, а затем выполнится console.log (res.joke) (как обычный асинхронный поток).

Это plnkr:

http://embed.plnkr.co/XlNR7HpCaIhJxskMJfSg/

33
задан FTLPhysicsGuy 24 November 2014 в 17:53
поделиться

2 ответа

Кажется, что переопределяющие методы и свойства в расширении работают с текущим Swift (Swift 1.1 / Xcode 6.1) только для методов и свойств Objective-C compatible .

Если класс получен из NSObject, то все его члены автоматически доступны в Objective-C (если возможно, см. ниже). Таким образом, с

class A : NSObject { }

ваш примерный код компилируется и работает как ожидалось. Расширение расширения кода кода работает, потому что NSManagedObject является подклассом NSObject.

В качестве альтернативы вы можете использовать атрибут @objc для метода или свойства:

class A { }

class B : A { }

extension A
{
    @objc var y : String { get { return "YinA" } }
}

extension B
{
   @objc override var y : String { get { return "YinB" } }
}

Методы, которые не представляются в Objective-C, не могут быть помечены @objc и не могут быть переопределены в расширении подкласса. Это относится, например, к методам, имеющим inout параметры или параметры типа enum.

38
ответ дан Martin R 26 August 2018 в 22:34
поделиться

Я испытал это на Xcode9. Закрытие и повторное открытие Xcode работало для меня. Вероятно, ошибка в компиляторе.

0
ответ дан Vincent 26 August 2018 в 22:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: