Грешка на компилатора при използване на функция в мързеливо съхранено свойство

Получавам грешка, която гласи „Не мога да конвертирам стойност от тип „Низ“ в тип аргумент „Тест““, когато се опитвам да върна стойност от функция в мързеливо съхранено свойство. Не мога да открия никакъв проблем в затварянето на мързеливия вар.

import UIKit

public struct Value {}

public class Test {

    var id: String = ""

    public func getValueById(id: String) -> Value {
        return Value()
    }

    public lazy var value: Value = {
        // Compiler error: Cannot convert value of 'String' to expected argument type 'Test'
        return getValueById(self.id)
    }() 
}

person Boon    schedule 26.11.2015    source източник


Отговори (1)


Компилаторът е объркан относно getValueById и съобщението за грешка е безсмислено - ако не и подвеждащо.

Това, от което се нуждаете, е да добавите self пред getValueById(self.id) вътре в затварянето:

public struct Value {}

public class Test {

    var id: String = ""

    public func getValueById(id: String) -> Value {
        return Value()
    }

    public lazy var value: Value = {
        return self.getValueById(self.id)
    }() 
}
person Eric Aya    schedule 26.11.2015
comment
Това е правилно. Ето цитата от главата на ARC, раздел Разрешаване на силни референтни цикли за затваряния (Езикът за програмиране Swift) - Swift изисква да напишете self.someProperty или self.someMethod() (вместо само someProperty или someMethod( )) всеки път, когато се позовавате на член на себе си в рамките на затваряне. Това ви помага да запомните, че е възможно да се заснемете случайно. - person zrzka; 27.11.2015