【问题标题】:Using "OR" constructor in Segue - Swift在 Segue 中使用“OR”构造函数 - Swift
【发布时间】:2018-06-18 17:08:06
【问题描述】:

Loads of answers(还有here 等等)关于触发一些不同功能的条件转场,但我想要做的只是使用 OR 运算符说“如果转场目标是这个或这个,那么去这里”(要传递的值等保持不变)。

我正在尝试这个:

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
//if destination is VC1 OR VC2...

    if let destVC = segue.destination as?
    FavouriteDetailViewController || FavouriteExerciseDetailViewController

//... then pass the values as specified 

    destVC.favouriteWorkoutPassed = workoutToPass
    destVC.favouriteObjectPassed = favouriteObjectToPass
    }

正如我所想的 ||将充当“OR”运算符,但我收到Optional type 'FavouriteDetailViewController?' cannot be used as a boolean; test for '!= nil' instead

的错误

任何帮助表示感谢:-)

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    类型的分离集(多种类型的“或”)在 Swift 中表示为协议。

    使用必要的属性/方法创建一个新协议:

    protocol SomeProtocol { // FIXME: Name me properly
        var favouriteWorkoutPassed: { get set }
        var favouriteObjectPassed: { get set }
    }
    

    扩展所需类型以符合此协议:

    extension FavouriteDetailViewController: SomeProtocol {}
    extension FavouriteExerciseDetailViewController: SomeProtocol {}
    

    转换为协议类型:

    // ...
    
    if let destVC = segue.destination as? SomeProtocol
        destVC.favouriteWorkoutPassed = workoutToPass
        destVC.favouriteObjectPassed = favouriteObjectToPass
    }
    
    // ...
    

    【讨论】:

    • 非常感谢 - 扩展是否只是在“发送”VC 中自行放入代码中?以及它在哪里说“设置” - 那是在寻找什么?
    • 这是一个简单的协议要求。它正在寻找具有这些名称的存储或计算属性的符合类型。我认为两个视图控制器都已经拥有它们,因此我没有在扩展中添加任何主体
    • 谢谢 - 我想我快到了 - 但我现在在选角部分得到“无法分配给属性:'destVC' 是一个 'let' 常量” - 有什么想法吗?
    • 您可能希望将协议限制为仅适用于类,尤其是UIViewControllerprotocol SomeProtocol: UIViewController { ...
    • 对不起,我正在尝试这个......协议 SeguePreparation:UIViewController 并收到错误“非类类型 'SeguePreparation' 不能从类 'UIViewController' 继承”
    猜你喜欢
    • 2015-04-17
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-24
    • 2014-09-10
    相关资源
    最近更新 更多