【发布时间】:2015-05-26 09:09:32
【问题描述】:
在 Array 扩展中创建泛型函数时,我发现了这个晦涩的问题。假设我有用于创建数组的 User 类:
class User : NSObject {
let name : String
let surname : String
init(name : String, surname : String) {
self.name = name
self.surname = surname
}
override var description : String {
return self.name + " " + self.surname
}
}
请注意,我需要它是 NSObject 的子类。现在让我们创建两个用户并将他们添加到用户数组中。
var user1 = User(name: "Jimmy", surname: "Page")
var user2 = User(name: "David", surname: "Guilmour")
var users = Array<User>()
users.append(user1)
users.append(user2)
现在我需要一个具有特定于 Array 或 User 的任何其他子类的函数的 Array 扩展,它将一些测试用户添加到任何用户数组。我把它写在扩展中而不是我自己的类型的原因是因为我想使用if let something = something as [User] 检查它的类型。如果我构建自己的类型,我将无法做到这一点。
extension Array {
mutating func addTestUsers<T : User>() {
var testUser1 = User(name: "King", surname: "Brown")
var testUser2 = User(name: "Carlos", surname: "Santana")
self.append(testUser1)
self.append(testUser2)
}
}
使用 append 函数或任何其他可以以某种方式改变初始数组的函数时会出现问题。
错误:Cannot invoke append with argument list of type (User)
我知道这是因为从未将扩展名指定为用户数组的扩展名,但正如我所见,我无法做到这一点。
【问题讨论】:
-
您不能定义仅适用于用户数组的数组扩展方法,例如参见stackoverflow.com/questions/24938948/… 或stackoverflow.com/questions/27350941/…。