首页 > 解决方案 > 填充不同类型数据的最佳和最有效的方法

问题描述

我有两个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
}

有没有其他方法可以用更少的代码填充这些数据?

标签: swiftuicollectionview

解决方案


多态的经典案例,您应该创建一个协议并让 Dog 和 Cat 类实现它。然后你可以调用这个协议实例上的函数。

下面是一个简化的例子。在此示例中,进行区分是没有意义的,因为就属性而言,两者CatDog是同一类。如果您想进行区分,这将变得很有趣,例如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)

推荐阅读