用超类约束扩展

时间:2019-10-30 18:10:39

标签: swift

Swift无法将我的桌子转换为家具。我必须在where子句中使用类似is的东西吗?

class Furniture {}
class Table: Furniture {}

extension Array where Element == Furniture {
    var material: String { print("material") }
}

let tables = [Table]()
tables.material() // error: '[Table]' is not convertible to 'Array<Furniture>'

1 个答案:

答案 0 :(得分:1)

所以这里发生了很多事情

  • 您说的是var material,但是当您说material()时,您尝试像函数一样调用它。

  • 您的var material是一个String,但是您忽略了从其getter返回String。

  • 您不能说Element == Furniture,因为这使得通用非通用。将其更改为:

  • 您的table.material返回一个值,但是您将其丢弃。

因此,将所有内容都考虑在内:

class Furniture {}
class Table: Furniture {}

extension Array where Element : Furniture {
    var material: String { return "Material" }
}

let tables = [Table]()
let s = tables.material

但是,这仅允许您的代码进行编译;正如评论中指出的那样,您所做的事情本身毫无意义。您可以给表一个material,但是很难知道给表的一个 array 一个material意味着什么。