gpt4 book ai didi

swift - Swift 中的通用/多态搜索

转载 作者:行者123 更新时间:2023-11-28 06:20:17 25 4
gpt4 key购买 nike

好的,所以我正在努力成为一名 Swift 泛型、多态性和面向协议(protocol)编程的专家。我正在慢慢地将所有这些拼凑在一起,最后在我正在制作的应用程序的网络框架中散布了一些通用功能。我的问题是,我这样做对吗?

假设我有一个用户类:

public class User {
public var familyName: String?
public var givenName: String?
public internal(set) var userID: String?
public var color: UIColor?
}

我还有一个 UserController,它可以帮助我跟踪为用户分配随机颜色、跟踪各种网络调用中的用户以及排序和过滤。这是我拥有的一个功能,可以让我通过我目前可用的任何属性来搜索用户:

public func getUser<T>(compareValue E: T) -> UEUser? {
let potentialUsers = self.users.filter({ (user) -> Bool in
if user.userID == E as? String {
return true
}else if user.familyName == E as? String{
return true
}else if user.givenName == E as? String{
return true
}else if user.color == E as? UIColor{
return true
}else{
return false
}
})
return potentialUsers.first
}

其中 self.users 是由 Controller 管理的用户数组。

此函数使用泛型,使我无需为每个属性编写搜索函数。

我想知道是否有更多的多态方式来比较函数参数和用户属性?此外,从类设计的角度来看,我能否利用面向协议(protocol)的编程来用更少的代码完成通用搜索?

谢谢

最佳答案

首先让我说,我知道您正在进行学术探索练习以理解泛型,但在这种特殊情况下,确实没有必要使用泛型来编写您展示的函数。可以编写相同的解决方案:

func getUser(compareValue: Any) -> User? {
return all_users.first(where: { (user: User) -> Bool in
return user.userID == compareValue as? String ||
user.familyName == compareValue as? String ||
user.givenName == compareValue as? String ||
user.color == compareValue as? UIColor
})
}

我只是使用 Any 类型作为搜索参数的替代。

如果您坚持使用多态解决方案来比较属性值,也许这种技术会吸引您的学术追求:

func compare_property<T>(_ property : T?, _ value : Any) -> Bool where T:Comparable {
return property == value as? T
}

func compare_property<T>(_ property : T?, _ value : Any) -> Bool where T:NSObject {
if let prop = property {
return prop.isEqual(value as? T)
} else {
return value == nil
}
}

var all_users : [User] = []
func getUser(compareValue: Any) -> User? {
return all_users.first)(where: { (user: User) -> Bool in
return compare_property(user.userID, compareValue) ||
compare_property(user.familyName,compareValue) ||
compare_property(user.givenName, compareValue) ||
compare_property(user.color, compareValue)
})
}

在使用更少代码方面...我的解决方案利用比较是可以使用基本操作组合的 Bool 值这一事实,使用更少的代码行。没有必要说(本质上):

if myExpression {
return true
} else {
return false
}

这个“if”表达式的计算结果与“myExpression”相同,因此将“if”语法放在它周围有点过分。

关于swift - Swift 中的通用/多态搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43811292/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com