Лучший и самый эффективный способ заполнить другой тип данных - PullRequest
0 голосов
/ 02 мая 2019

У меня есть два UICollectionView's, и я передаю уникальный тип данных (Cats, Dogs) одному и тому же 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
}

Есть ли другой способ заполнить эти данные меньшим количеством кода

1 Ответ

0 голосов
/ 02 мая 2019

Классический случай полиморфизма, вы должны создать протокол и реализовать его в классах 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...