необходимо получить доступ к свойству подкласса из свойства суперкласса - PullRequest
1 голос
/ 07 апреля 2019

Мне нужно передать модели типа decodable и получить доступ к заголовку и субтитрам из него, так как Decodable не имеет свойств заголовка и субтитров. Я реализовал расширение для decodable и добавил свойства заголовка и субтитров в Decodable. Так что любой объект типа Decodableмог написать decodableObject.title, поэтому, когда я передаю объект, который соответствует decodable и содержит свойства заголовка и субтитров, мне нужно получить доступ к данным этого объекта, а не к данным объекта Docodable, но что случится, если он просто получит доступ к свойствам расширения Decodable, чтобы получить доступ к моему целевому объекту?Я должен сделать downcasting к этому классу, который затем я должен написать реализацию для каждого типа модели

//decalring struct which conforms to Decodable 
struct TestModel:Decodable {
    var title:String?
}
//added property 
extension Decodable {
    var title:String?{
        return "Decodable base"
    }
}

func setup(){
        var testModel = TestModel()
        testModel.title = "Subclass"
        checkProperties(model: testModel, mod: TestModel.self)
    }

    func checkProperties<T:Decodable>(model:Any,mod:T.Type){
        typealias MMM = T
        let title = (model as! MMM).title
        print("type is \(title)")
    }
// the resutl will be "Type is Decodable Base"

Мне нужно, чтобы ожидаемый результат был // результат будет "Тип подкласса"

1 Ответ

1 голос
/ 07 апреля 2019

Ну, может быть, это вам поможет:

protocol HasTitle {
  var title: String? { get }
}

extension Decodable {
  var title:String? {
    return "Decodable base"
  }
}

struct TestModel: Decodable, HasTitle {
  var title: String?
}

func checkProperties<T:HasTitle>(model:Any,mod:T.Type){
  typealias MMM = T
  let title = (model as! MMM).title
  print("type is \(title)")
}

РЕДАКТИРОВАТЬ

Это использует концепцию, называемую ретроактивным моделированием.Обоснование заключается в выделении этого свойства в протоколе, который я назвал HasTitle.Хитрость заключается в создании расширения для Decodable, которое имеет свойство title, объявленное так же, как вы ожидаете в протоколе HasTitle.Затем тот тип, который соответствует Decodable, получает это свойство title по умолчанию, и вам нужно просто объявить HasTitle соответствие.Однако вы все еще можете переопределить свойство title.

...