Почему тот же тип закрытия не назначается - PullRequest
2 голосов
/ 23 сентября 2019
class ParentClass<T>
{
    var success : ((T)->Void)?
}

extension ParentClass
{
   func success<T>(success: ((T) -> Void)?) -> ParentClass where T : Codable
   {
        self.success = success
        return self
    }
}

здесь я только что попытался присвоить значение параметра родительской переменной класса, но он выдает эту ошибку. Невозможно присвоить значение типа '((T) -> Void)?' to type '((T) -> Void)?'

Также, когда я обращаюсь к приглашению с предложением, снова снова он даетмне та же ошибка.

Ответы [ 2 ]

2 голосов
/ 23 сентября 2019
func success<T>(success: ((T) -> Void)?) -> ParentClass where T : Codable

<T> здесь затеняет T в ParentClass.Это так же, как если бы у вас был локальный var с тем же именем, что и у свойства.Просто удалите его, и тени исчезнут:

extension ParentClass where T: Codable {
    func success(success: ((T) -> Void)?) -> ParentClass
}

Обратите внимание, что этот метод добавляется только тогда, когда T оказывается Codable.Здесь не требуется, чтобы T всегда был Codable.Если вам это всегда нужно, вы должны определить ParentClass<T: Codable> (и удалить предложение where).

(Спасибо, что Mojtaba напомнил мне, что здесь where должен идти по расширению, а нефункция.)

2 голосов
/ 23 сентября 2019

Поскольку тип Generic , который вы использовали в определении класса (и для переменной), равен NOT , то же самое с Generic, который вы определили в сигнатуре функции.Вы должны убедиться, что оба одинаковы:

class ParentClass<T> {    
    var success : ((T)->Void)?
}

extension ParentClass {
   func success(success: ((T) -> Void)?) -> ParentClass {
        self.success = success
        return self
    }
}

И если вы хотите, чтобы он был кодируемым:

class ParentClass<T: Codable> { ,,, }

Или в расширении:

extension ParentClass where T: Codable { ,,, }
...