Swift 惰性属性的更多细节
Swift Lazy Properties in More Detail
惰性属性的基本概念如下。
// 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 使用 { 自定义代码 }() 语法。我的第一个想法是,他们在定义惰性 属性 时只是简单地使用闭包来消除先创建函数的需要。然后我尝试了以下。
// 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 堆栈末尾的 () 和检查末尾的 : () 属性 让我很困惑。
保重,
乔恩
在苹果的例子中,
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
}()
惰性属性的基本概念如下。
// 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 使用 { 自定义代码 }() 语法。我的第一个想法是,他们在定义惰性 属性 时只是简单地使用闭包来消除先创建函数的需要。然后我尝试了以下。
// 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 堆栈末尾的 () 和检查末尾的 : () 属性 让我很困惑。
保重,
乔恩
在苹果的例子中,
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
}()