Swift Lazy属性更多细节

时间:2015-01-19 23:19:12

标签: ios swift core-data

惰性属性的基本概念如下。

//  I create a function that performs a complex task.
func getDailyBonus() -> Int
{
    println("Performing a complex task and making a connection online")
    return random()  
}

//I set define a property to be lazy and only instantiate it when it is called.  I set the property equal to the function with the complex task 
class  Employee
{
    // Properties
    lazy var bonus = getDailyBonus()
}

我开始使用CoreData开发一个新项目,并注意到Core Data堆栈是使用Lazy Properties设置的。但是,代码不是我以前见过的,希望有人能帮助我理解语法。

// From Apple
lazy var managedObjectModel: NSManagedObjectModel =
{
    // The managed object model for the application. This property is not optional. It is a fatal error for the application not to be able to find and load its model.
    let modelURL = NSBundle.mainBundle().URLForResource("FLO_Cycling_1_1_1", withExtension: "momd")!
    return NSManagedObjectModel(contentsOfURL: modelURL)!
}()

Apple使用{custom code}()语法。我的第一个想法是,他们只是在定义惰性属性时使用闭包来消除首先创建函数的需要。然后我尝试了以下内容。

//  I tried to define a lazy property that was not an object like so. 
lazy var check = {
    println("This is your check")
}()

编译器抱怨并建议以下修复。

//  I do not understand the need for the ": ()" after check 
lazy var check: () = {
    println("This is your check")
}()

有人可以帮我理解语法吗? CoreData堆栈末尾的()和check属性末尾的:()让我感到困惑。

小心,

乔恩

1 个答案:

答案 0 :(得分:4)

在苹果的例子中,

lazy var managedObjectModel: NSManagedObjectModel =
{
    // The managed object model for the application. This property is not optional. It is a fatal error for the application not to be able to find and load its model.
    let modelURL = NSBundle.mainBundle().URLForResource("FLO_Cycling_1_1_1", withExtension: "momd")!
    return NSManagedObjectModel(contentsOfURL: modelURL)!
}()

你可以看到,apple隐含地指定了变量类型:

lazy var managedObjectModel: NSManagedObjectModel

并从该代码本身返回NSManagedObjectModel

在第一个示例中,您没有指定该变量的类型,也没有返回任何值(分配或初始化)。所以编译器抱怨你需要隐式指定一个类型并需要初始化它。

基本思想是,你需要隐式指定它的类型,你需要初始化它(只写一个println,不会初始化它。所以在你的场景中。你对那个懒惰没有任何价值因此你需要将它的类型指定为一个空闭包,然后用它初始化它。

另一个例子,以下内容将7分配给支票:

lazy var check : Int = {
    println("This is your check")
    return 7
}()