【问题标题】:Having a property which can be any object that adheres to a specific protocol具有可以是任何遵守特定协议的对象的属性
【发布时间】:2017-05-05 19:37:30
【问题描述】:

我正在用 Swift 构建一个应用程序,并且我有一个视图控制器,我将在 2 个地方使用它来显示非常相似但有一些细微差别的屏幕。

我有一个名为 myProtocol 的协议,并且我有一个视图控制器,它具有一个名为 viewModel 的属性,它遵循该协议。 viewModel 可以是 aViewModel 或 bViewModel 的实例,但它们都具有来自协议的相同方法,但根据使用视图控制器的位置返回不同的值。

现在,在objective-c中我可以做到

@property (nonatomic, strong) id <myProtocol>viewModel

然后可以将其设置为viewModel = [aViewmodel new]viewModel = [bViewmodel new]。我怎样才能在 swift 中实现类似的目标?

我尝试将属性添加为let viewModel: myProtocol? = nil,但这会给出一个错误,指出它无法推断类型。只是想知道你们是否能给我一些建议。我是 swift 新手,但已经使用 Objective-c 几年了

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    假设您使用的是 Swift 3:

    protocol MyProtocol {
        //...
    }
    
    var viewModel:MyProtocol?
    
    class ViewModel: MyProtocol {
        //...
    }    
    
    viewModel = ViewModel()
    

    【讨论】:

    • 不客气。在 SO,我们通过投票和接受答案来表示感谢。
    • 当时我试着接受,但它说我需要等待,我要赶紧去剪头发! ? 就在那里接受了。谢谢!另外,跟进问题,是否可以声明任何遵守该协议的东西都必须有一个实现函数(或遵守第二个协议)的委托,还是我在想这个错误?
    • 不确定你的意思,但对我来说听起来像是一个新话题。你最好提出一个新问题,展示你的代码,描述你想用这段代码实现什么以及你遇到了什么问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 2022-01-05
    • 2017-10-16
    • 2023-04-06
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    相关资源
    最近更新 更多