【问题标题】:Declare a variable or constant that conforms to a protocol in Swift声明一个符合 Swift 协议的变量或常量
【发布时间】:2026-02-08 20:00:01
【问题描述】:

在 Swift 中如何声明一个符合协议的变量(或常量)?

我试过了

let whatever: protocol <myProtocol>

let whatever: myProtocol

但是设置的时候报错

Cannot convert the expression's type '()' to type 'myProtocol'

【问题讨论】:

  • 你在哪里写这个?它在类型定义中吗?
  • 似乎你遗漏了一些东西:当你“设置它”时你到底在做什么?
  • @Chuck 是的,它在表 VC 的类定义中(在 Obj-C 术语中,我想要对符合协议的属性的强引用,并且我想在我的 init 中初始化它)
  • @Yawar 我在做self.whatever = ObjectThatConformsToMyProtocol()
  • 错误消息表明ObjectThatConformsToMyProtocol() 实际上不符合协议 :-) 检查该表达式以找出如何使其符合....

标签: protocols swift


【解决方案1】:

没有必要做这样的事情,因为当你声明变量(或常量)的类型时,应该知道它是否符合协议。但如果有时您使用的是旧的 objc id,您可能会得到一个 AnyObject。在这种情况下,您只需进行向下转换以将其转换为协议类型并使用它。

let whatever: AnyObject = someObj
let conformProtocol = whatever as myProtocol

conformProtocol.callMethod()

或者您可能想使用as? 进行更安全的转换。

【讨论】:

    【解决方案2】:

    From the docs:

    协议是命名类型,因此它们可以像其他命名类型一样出现在代码中的所有相同位置,如作为类型的协议中所述。但是,您不能构造协议的实例,因为协议实际上并未针对它们指定的要求提供实现。

    【讨论】:

    • 没关系,但问题并不表明这里发生了这种情况。如果代码类似于let whatever = MyProtocol(),您的观点将是有效的——但事实并非如此。