Двойники сопоставимы в Swift?
Свифт 3, Xcode 8β2.
Я реализовал класс, который сортирует сопоставимые данные, и попытался проверить его с помощью Doubles. К сожалению я получаю ошибку "Cannot convert value of type '[Double]' to specified type '[T]'."
, Я воспроизвел ошибку в примере кода ниже:
class foo<T: Comparable> {
let data: [T] = [Double]()
}
Правильно ли я полагаю, что Doubles сопоставимы и, если да, как я могу устранить ошибку выше?
Спасибо.
2 ответа
Ваша собственность имеет общий тип, T
: он не может быть объявлен как содержащий конкретный тип. Просто используйте [T]
в декларации, и использовать Double
при создании экземпляра класса.
Для моего примера я также сделал свойство var, чтобы я мог изменить его:
class Foo<T: Comparable> {
var data: [T] = [T]()
}
let f = Foo<Double>()
f.data = [42.0, 33.0]
f.data.sort()
print(f.data)
дает
[33,0, 42,0]
как и ожидалось.
Проблема с этим кодом
class Foo<T: Comparable> {
let data: [T] = [Double]()
}
это ты объявил data
как универсальный тип, который должен быть Comparable
, Это означает, что он может содержать любое значение типа T
, А также T
определяется, когда используется класс.
Foo<String>()
Foo<Double>()
Foo<Bool>()
Посмотрите на пример выше. В первом случае T
это String
, С этой информацией должно быть ясно, что эта строка не может быть скомпилирована
let data: [T] = [Double]()
потому что это было бы эквивалентно написанию
let data: [String] = [Double]()
это явно неправильно.
Решение
Как уже предложено @Eric D.
class Foo<T: Comparable> {
let data: [T] = []
}
Теперь данные заполнены пустым массивом правильного типа.
Примеры
Так что в этом случае
Foo<String>()
это массив String
,
В этом случае
Foo<Double>()
он заполнен массивом Double
,
И, наконец, в этом случае
Foo<Bool>()
с массивом Bool
,