Двойники сопоставимы в 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,

Другие вопросы по тегам