Могу ли я создать массив полугетерогенных объектов generi c в Swift? - PullRequest
0 голосов
/ 25 февраля 2020

Я хотел бы создать массив различных объектов одного и того же родового класса c:

import UIKit
struct S<V: UIView> {}
let a: [S<UIView>] = [S<UIButton>(), S<UILabel>()]

Cannot convert value of type 'S<UIButton>' to expected element type 'S<UIView>' Cannot convert value of type 'S<UILabel>' to expected element type 'S<UIView>'

Единственный обходной путь, который я мог бы предложить, - это оболочка протокола:

import UIKit
protocol P {}
struct S<V: UIView>: P {}
let a: [P] = [S<UIButton>(), S<UILabel>()]

Я не думаю, что необходимо переопределять все свойства и методы S в P. Существуют ли другие решения?

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

С этим обходным путем можно столкнуться с проблемой необходимости ассоциированного типа в протоколе:

import UIKit
protocol P {
    associatedtype V: UIView
}
struct S<V: UIView>: P {}
let a: [P] = [S<UIButton>(), S<UILabel>()]

Protocol 'P' can only be used as a generic constraint because it has Self or associated type requirements

Как мне решить эту проблему?

...