- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
好的,所以我正在努力成为一名 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/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!