在 Segue 中使用“OR”构造函数 - Swift

Posted

技术标签:

【中文标题】在 Segue 中使用“OR”构造函数 - Swift【英文标题】:Using "OR" constructor in Segue - 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

的错误

任何帮助表示感谢:-)

【问题讨论】:

【参考方案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' 继承”

以上是关于在 Segue 中使用“OR”构造函数 - Swift的主要内容,如果未能解决你的问题,请参考以下文章

应用调试系统调用SWI

通过Visual C ++编译器识别ARM软件中断(SWI)函数

构造函数出错(错误:'('或'['预期)[关闭]

使用构造函数与 state = 在反应组件中声明状态有啥区别?

使用辅助函数从另一个类执行 Segue

使用 segue 的参数调用函数