2015-11-26 5 views
1

Я получаю сообщение об ошибке «Невозможно преобразовать значение типа« String »в тип аргумента« Test »при попытке вернуть значение из функции в ленивом сохраненном свойстве. Я не могу обнаружить никаких проблем в закрытии lazy var.Ошибка компилятора при использовании функции в ленивом сохраненном объекте

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) 
    }() 
} 

ответ

2

Компилятор путаются 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) 
    }() 
} 
+1

Это correct.Here в цитату из главы АРК, в разделе Устранение Сильные Эталонные Циклы для затворов (Свифт языка программирования) - _Swift требует, чтобы вы писали self.someProperty или self.someMethod() (а не только someProperty или someMethod()) всякий раз, когда вы ссылаетесь на члена «я» в закрытии. Это поможет вам вспомнить, что можно случайно захватить себя. – robertvojta