#ios #swift #swift-protocols
#iOS #swift #swift-протоколы
Вопрос:
protocol Device {
}
protocol ActiveDevice: Device {
}
protocol NoActive: Device {
}
ViewController:
class ViewController : UIViewController {
let device: Device
}
Настройка устройства для ViewController. currentDevice — это объект, который соответствует протоколу Device
vc.device = currentDevice as! ActiveDevice
Проверка, соответствует ли он протоколу:
if let currentDevice = device as? NoActive {
print("Its not active device")
}else if let currentDevice = device as? ActiveDevice {
print("Its active device")
}else {
print("Its just a device")
}
Он всегда печатает Its not active device
то, что я ожидал бы в этом случае, что он будет печатать Its active device
Комментарии:
1. Вы не можете инициализировать a
protocol
какActiveDevice()
. Не уверен, поможет ли это понять реальную проблему.2. Да, в этом случае я устанавливаю объект, который сопоставляет протокол ActiveDevice с устройством в контроллере
3. Я думаю, текущего кода недостаточно, чтобы выяснить проблему.
4. Что
vc
в вашем коде? и я думаю, вам следует создать переменную property, чтобы назначить ее позжеlet device: Device
.5. Обычно протокол используется для связи между двумя объектами, например, 2 контроллерами. Чего вы хотите достичь здесь, и я думаю, вы можете просто назначить протокол конкретному, соответствовать like
OldViewController: UIViewController, ActiveDevice
и просто назначить asvc.device = self
, где vc будет инстанцированным объектомViewController
, тогда это сработает.
Ответ №1:
Пожалуйста, проверьте следующий код и дайте мне знать, если это поможет.
protocol Device {
}
protocol ActiveDevice: Device {
}
protocol NoActive: Device {
}
// class TestDevice: Device {
// class TestDevice: ActiveDevice {
class TestDevice: NoActive {
}
let currentDevice = TestDevice()
// let device: Device = currentDevice as! ActiveDevice
(It threw error as "Could not cast value of type '__lldb_expr_9.TestDevice' (0x11a2f9090) to '__lldb_expr_9.ActiveDevice' (0x11a6d0628)."). We cannot do this.
let device: Device = currentDevice
if device is NoActive {
print("Its not active device")
}else if device is ActiveDevice {
print("Its active device")
}else {
print("Its just a device")
}
Теперь выводом является «Его неактивное устройство». И после изменения тестового устройства на «ActiveDevice», оно напечатало «Его активное устройство» и так далее.
Комментарии:
1. @kosas, это было полезно? ваша проблема решена?