Я пытаюсь лучше понять протоколы в Swift. В частности, необязательные методы протокола. Я думал, что этот вопрос, возможно, придется делать с моим протоколом определяется/используется в другом файле, но если вы поместите в детской площадке, вы получите тот же вопрос:Значение типа 'X' не имеет члена 'y' - необязательный func в протоколе
import Foundation
@objc protocol MyProtocol {
optional func shouldJump() -> Bool
}
extension NSObject : MyProtocol {}
class Test {
func testJump() {
let object = NSObject()
let jump = object.shouldJump?() ?? true
print("should jump: \(jump)")
}
}
let t = Test()
t.testJump()
Вот сообщение об ошибке:
error: value of type 'NSObject' has no member 'shouldJump'
let jump = object.shouldJump?() ?? true
^~~~~~ ~~~~~~~~~~
По какой-то причине он не признает, что протокол определен в NSObject. Выполнение кода находит это, но компилятор не пропускает его.
Я не уверен, что моя часть ?? true
будет работать, но я хочу, чтобы это значение по умолчанию, если метод не определен.
Как я могу заставить это работать?
Начиная с версии Xcode версии 7.3 beta (7D152p), используя строковые литералы, поскольку селектор устарел. Эквивалентный вызов теперь object.respondsToSelector (#selector (MyProtocol.shouldJump)). –
@PriceRingo Спасибо, я еще не использую бета-версию, поэтому я не реализовал это изменение. Когда это требуется последней стабильной версией Xcode, я обновлю этот ответ. – JAL
Не могли бы вы также написать код для своего последнего варианта? Как человек с годами Objective-C под мной, но не очень Swift, это похоже на самый интересный подход. :) –