gpt4 book ai didi

ios - 在 Array 扩展中的泛型函数中使用 append

转载 作者:行者123 更新时间:2023-11-28 09:07:27 25 4
gpt4 key购买 nike

我在 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 扩展,它具有特定于 Array 或 User 的任何其他子类的功能,它将向任何用户数组添加一些测试用户。我将它写在扩展而不是我自己的类型中的原因是因为我想使用 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)
}
}

当使用追加函数或任何其他可以以某种方式改变初始数组的函数时,问题就来了。

错误:无法使用类型为 (User) 的参数列表调用追加

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

最佳答案

如@Martin R 的评论中所建议,如果您查看Array extension to remove object by value ,投票最高的答案建议编写一个将数组作为参数的函数,在您的情况下,您可以执行以下操作:

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]
}

要使之前的功能正常工作,您需要将 User 中的 init(name : String, surname : String) 标记为 required:

class User : NSObject {
// ...
required init(name : String, surname : String) {
self.name = name
self.surname = surname
}
// ...
}

将其标记为required 意味着User 的任何子类必须 实现init(name : String, surname : String),因此在 addTestUsers 中使用 T(name: "...", surname: "...") 是安全的。

关于ios - 在 Array 扩展中的泛型函数中使用 append,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30454244/

25 4 0
文章推荐: ios - 无法构建包含 Objective-C Tesseract 库的 Swift 应用程序
文章推荐: javascript - 推送响应菜单不会自行打开并且不起作用
文章推荐: html - 页脚始终位于底部,具有固定的页眉/高度
文章推荐: javascript - windows 8 javascript 应用程序打印片段不打印
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com