Получение ошибки: строка не может быть преобразована в 'T' - PullRequest
0 голосов
/ 10 ноября 2019

Этот код компилируется и работает нормально:

class Numbers {
    func operateOn<T>(_ num1: T, _ num2: T, do task: (T, T) -> ()) {
        task(num1, num2)
    }
}

let n = Numbers()
n.operateOn(1,2) {
    print(($0 + $1) * 10)
}

n.operateOn("l","ll") {
    print(($0 + $1))
}

И все же для следующего кода не компилируется.

func process<T> (add: String, completion: (T) -> () ) {
    completion("k") // ERROR
}

Тем не менее, я получаю следующую ошибку:

'Строка' не может быть преобразована в 'T'

Я попытался передать Int, но я только что получил другую ошибку:

'Int' не конвертируется в 'T'

Не может удовлетворить Int или Stringобщее требование, которое не имеет никаких ограничений?!

Ответы [ 2 ]

2 голосов
/ 11 ноября 2019

Проблема в том, что ваш код должен работать для любого T. Например, если T равно Int, тогда completion имеет тип (Int) -> (), вполне допустимо вызывать

n.process<Int>("") { $0 + 1 }

, а completion("k") придется делать "k" + 1, что не имеет смысла.

Это будет то же самое практически в любом языке с дженериками (C ++ отличается, потому что вместо него используются шаблоны для той же цели).

0 голосов
/ 10 ноября 2019

Не может Int или String удовлетворить общее требование, которое не имеет никаких ограничений?!

Конечно, может. Но это не причина, по которой компилятор выдает ошибку.

Подумайте, что произойдет, если вы ограничите обобщенную функцию / параметр в теле функции ? Это больше не будет универсальной функцией!

Представьте себе, если бы вы написали свою operateOn функцию так:

class Numbers {
    func operateOn<T>(_ num1: T, _ num2: T, do task: (T, T) -> ()) {
        task("k", num2)
    }
}

Вы бы сказали, что T является универсальной? Или что это типа String? Если вы сделали его String, то может ли num2 быть универсальным типом, каким он хочет быть? Это не может!

Если это тип String, то он больше не универсальный . Поскольку компилятор не может этого допустить, он выдаст эту ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...