Ios 在数组扩展内的泛型函数中使用append

Ios 在数组扩展内的泛型函数中使用append,ios,swift,generics,Ios,Swift,Generics,我在数组扩展中创建泛型函数时发现了这个模糊的问题。假设我有一个用于创建数组的用户类: class User : NSObject { let name : String let surname : String init(name : String, surname : String) { self.name = name self.surname = surname } override var description

我在数组扩展中创建泛型函数时发现了这个模糊的问题。假设我有一个用于创建数组的用户类:

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)
当使用append函数或任何其他可以以某种方式改变初始数组的函数时,就会出现问题

错误:无法使用User类型的参数列表调用append


我知道这是因为扩展从未被指定为用户数组的扩展,但正如我所看到的,我无法做到这一点。

正如@Martin R的评论中所建议的,如果你看一下,投票率最高的答案建议写一个以数组为参数的函数,在你的例子中,你可以这样做:

func addTestUsers(inout array: [User]) {
    let user1 = User(name: "King", surname: "Brown")
    let user2 = User(name: "Carlos", surname: "Santana")
    array += [user1, user2]
} 
然后您可以这样使用:

var array = [User(name: "Jimmy", surname: "Page")]
addTestUsers(&array) // [Jimmy Page, King Brown, Carlos Santana]
但是,如果您打算创建User的子类,那么前面的方法是不合适的,因为您无法将子类数组作为参数传递。在这种情况下,您可以覆盖addTestUsers以接受您的子类,但更优雅的解决方案可能是:

func addTestUsers<T: User>(inout array: [T]) {
    let user1 = T(name: "King", surname: "Brown")
    let user2 = T(name: "Carlos", surname: "Santana")
    array += [user1, user2]
}
将其标记为必需意味着用户的任何子类都必须实现initname:String,姓氏:String,因此使用Tname:…,姓氏:…,是安全的。。。在addTestUsers中。

不能定义仅适用于用户数组的数组扩展方法,请参见示例或。
func addTestUsers<T: User>(inout array: [T]) {
    let user1 = T(name: "King", surname: "Brown")
    let user2 = T(name: "Carlos", surname: "Santana")
    array += [user1, user2]
}
class User : NSObject {
    // ... 
    required init(name : String, surname : String) {
        self.name = name
        self.surname = surname
    } 
    // ... 
}