Swift проверяет, соответствует ли класс протоколу always true

#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 и просто назначить as vc.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, это было полезно? ваша проблема решена?