Swift协议带有可变属性

4

我正在尝试创建一个具有可变属性的Swift协议。根据文档,可以在函数中实现:

func arithmeticMean(_ numbers: Double...) -> Double {
    var total: Double = 0
    for number in numbers {
        total += number
    }
    return total / Double(numbers.count)
}
arithmeticMean(1, 2, 3, 4, 5)

但是尝试像下面这样在协议中创建Variadic参数:

struct ProductModel {
    
}

protocol SubscriptionModel {
    var products: ProductModel... { get set }
}

这个错误的原因在于:

enter image description here

在一个 Protocol 中创建一个 Variadic 属性是不可能的吗?

1个回答

8
在协议中创建可变参数属性是不可能的。这只是更大事实的一个反映,即可变参数不是一种类型。你试图在这里声明 `products` 是 `Variadic ProductModel` 类型,但是实际上没有这样的类型。无论何时,都不能将任何变量声明为该类型;这不仅适用于协议。
唯一可以使用可变参数符号的地方是实际的函数声明中的参数类型,但它只是一种符号,而不是一种类型。这是一种表达方式,表示该函数可以接受一系列实际类型(例如文档中的 Double)。
因此,如果您的协议想要声明一个带有可变参数的方法,那就没问题。但是可变参数类型的变量的概念是没有意义的。
所以只需声明变量的类型为 `[ProductModel]`。这就是说“某些未知数量的 ProductModel 对象”。这也是可变参数符号的真正含义,因为该参数在函数体内作为数组接收。

2
你可能会说,“这在语言中有点漏洞”- 你是对的。除了缺少星号字符外,可变参数基本上是Swift中非常部分性的修补程序。 - matt
嘿,马特,谢谢!这就是我想的,只是想确认一下。 - Roi Mulia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接