swift - 填充不同类型数据的最佳和最有效的方法
问题描述
我有两个UICollectionView's
,我将一种独特类型的数据(猫、狗)传递给同一个UIViewController
. 这两种类型都有独特的属性,如 imageUrl、性别、年龄等。根据文本视图填充这些数据的最佳方法是什么?
fileprivate var isDog = false
var detailsData: Any? {
didSet {
if detailsData is Dog {
isDog = true
} else if detailsData is Cat {
isDog = false
}
}
}
override func viewDidLoad() {
super.viewDidLoad()
isDog ? fillDogInfo(detailsData: detailsData as! Dog) : fillCatInfo(detailsData: detailsData as! Cat)
}
fileprivate func fillDogInfo(detailsData: Dog) {
contactButtonOutlet.isHidden = false
// Short Info
if let name = detailsData.name {
shortInfoMutableAttributedString.append("\(name)\n".customAttributedString(font: Font.header, textColor: UIColor.darkGray))
}
if let age = detailsData.age {
shortInfoMutableAttributedString.append("\(age)\n".customAttributedString(font: Font.header, textColor: UIColor.darkGray))
}
shortInfoTextView.attributedText = shortInfoMutableAttributedString
}
fileprivate func fillCatInfo(detailsData: Car) {
contactButtonOutlet.isHidden = true
if let name = detailsData.name {
shortInfoMutableAttributedString.append("\(name)\n".customAttributedString(font: Font.header, textColor: UIColor.darkGray))
}
if let gender = detailsData.gender {
shortInfoMutableAttributedString.append("\(gender)\n".customAttributedString(font: Font.header, textColor: UIColor.darkGray))
}
shortInfoTextView.attributedText = shortInfoMutableAttributedString
}
有没有其他方法可以用更少的代码填充这些数据?
解决方案
多态的经典案例,您应该创建一个协议并让 Dog 和 Cat 类实现它。然后你可以调用这个协议实例上的函数。
下面是一个简化的例子。在此示例中,进行区分是没有意义的,因为就属性而言,两者Cat
和Dog
是同一类。如果您想进行区分,这将变得很有趣,例如bark()
仅向Dog
类添加一个函数
protocol Pet{
var name: String { get set}
func infoString() -> String
}
class Dog: Pet{
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
func infoString() -> String {
return "Dog \(name) has age \(age)"
}
}
class Cat: Pet{
var name: String
var gender: String
init(name: String, gender: String) {
self.name = name
self.gender = gender
}
func infoString() -> String {
return "Cat \(name) has gender \(gender)"
}
}
fileprivate func fillPetInfo(pet: Pet){
textView.text = pet.infoString()
}
let dog = Dog(name: "Ruffer", age: 8)
fillPetInfo(pet: dog)
推荐阅读
- java - 我无法使用 Java 中的“.add”运算符将元素添加到我的数组列表(多项式函数)
- angular - 同时调用多个api
- svg - 用于嵌套 svg 元素中的线性渐变的坐标系
- javascript - 如果 angularJs 中的请求超过 30 秒,如何显示警报?
- c# - 为 appsettings.json 中的属性添加值并将其转换为 json
- mathjax - svelte js:通过 mathjax 渲染 mathml
- docker - 如何在 shell 脚本中运行“docker run ..”命令
- react-native - KEYCLOAK:redirectUrl:'
:/打回来' - scala - 使用 scala 从 dynamodb 获取表大小
- javascript - 无法从mysql推送到数组结果