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
}
// ...
}