себя как? в расширении протокола

Я пытался использовать «я» в расширении протокола. Он вылетал с ошибкой EXC_BAD_ACCESS при работе на реальном устройстве, но хорошо работал на симуляторе. Что я должен сделать, чтобы это сработало? Спасибо

Весь мой код:

protocol SomeProtocol: class {

}

protocol DataSetEditable {
    func add(_ data: Data)
}

extension DataSetEditable where Self: SomeClass {
    func add(_ data: Data) {
        print(data)
        if let someProtocol = self as? SomeProtocol {
            print(someProtocol)
            //do some extra works
        }
    }
}

class SomeClass: UIView {

}

class MyClass: SomeClass, DataSetEditable, SomeProtocol {
}

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let myClass = MyClass()
        myClass.add(Data())
    }
}

person user3087360    schedule 16.04.2018    source источник


Ответы (2)


Во-первых, это, вероятно, ошибка Swift, поскольку компилятор должен был предоставить ошибку, если он не может это обработать. Вы должны открыть его по адресу bugs.swift.com. Похоже, это связано с SR-544.

Тем не менее, как правило, очень сложно согласовать типы ObjC с протоколами только для Swift. Иногда это работает, иногда нет. Это довольно сложное соответствие, и очевидно, что оно не всегда работает. Решение состоит в том, чтобы предоставить протокол ObjC, добавив @objc:

@objc protocol SomeProtocol: class {}
person Rob Napier    schedule 16.04.2018
comment
Это работает для меня. Я сообщу об этой ошибке, спасибо за вашу помощь. - person user3087360; 17.04.2018

Вы можете попытаться расширить DataSetEditable, как показано ниже.

extension DataSetEditable where Self: SomeClass & SomeProtocol {
  func add(_ data: Data) {
   ...
  }
}

Теперь вышеуказанный метод расширения func add(_ data: Data) доступен только для подкласса SomeClass и следует за SomeProtocol.

person Ratnesh Jain    schedule 16.04.2018
comment
Я не могу этого сделать, потому что у меня есть AnotherClass, который является дочерним по отношению к SomeClass и не соответствует протоколу SomeProtocol. Так что AnotherClass не может использовать функцию add(_ data: Data) и должен реализовать add(_ data: Data) сам по себе. - person user3087360; 17.04.2018