Невозможно назначить массив протоколов универсальному массиву
Ниже приведены некоторые коды, некоторые дают ошибку времени компиляции, некоторые нет. Есть ли ошибка или я что-то упускаю из-за дженериков здесь?
1) не работает:
class DataSource: NSObject {
var dataObjects: [DataType]
init<T where T: DataType>(dataObjects: [T]) {
self.dataObjects = dataObjects //Cannot assign value of type [T] to type [DataType]
}
}
Но это работает:
class DataSource: NSObject {
var dataObjects: [DataType]
init<T where T: DataType>(dataObjects: [T]) {
self.dataObjects = []
for dataObject in dataObjects {
self.dataObjects.append(dataObject)
}
}
}
2) не работает:
class DataSource: NSObject {
var dataObjects: [DataType]
init<T:DataType>(dataObjects: [T]) {
self.dataObjects = dataObjects //Cannot assign value of type [T] to type [DataType]
}
}
Но это работает:
class DataSource: NSObject {
var dataObjects: [DataType]
init<T:DataType>(dataObjects: [T]) {
self.dataObjects = []
for dataObject in dataObjects {
self.dataObjects.append(dataObject)
}
}
}
3) Это также работает:
class DataSource<T: DataType>: NSObject {
var dataObjects: [T]
init(dataObjects: [T]) {
self.dataObjects = dataObjects
}
}
Также в чем разница между T where T: DataType
а также T:DataType
PS:DataType - пустой протокол
1 ответ
Скорее всего, проблема в том, что ваш протокол не наследуется от ссылочного типа данных, в то время как массив ожидает объекты.
Например, Any
не всегда по ссылке
protocol DataType: Any {
}
class DataSource: NSObject {
var dataObjects: [DataType]
init<T:DataType>(dataObjects: [T]) {
self.dataObjects = dataObjects //Cannot assign value of type [T] to type [DataType]
}
}
с другой стороны, AnyObject всегда является:
protocol DataType: AnyObject {
}
class DataSource: NSObject {
var dataObjects: [DataType]
init<T:DataType>(dataObjects: [T]) {
self.dataObjects = dataObjects //Works fine
}
}