swift 中的惰性函数求值
Lazy functions evaluation in swift
想知道是否可以懒惰地计算一个简单的 if 语句。下面是一个将打印 "this is foo" 和 "this is bar" 的示例,但我真的想让它只打印第一个字符串:
func foo() {
println("this is foo")
}
func bar() {
println("this is bar")
}
func maybeFooOrBar(isFoo: Bool) {
let myFoo = foo()
let myBar = bar()
isFoo ? myFoo : myBar
}
我找不到 Swift 不是惰性求值语言的规范证据,但我相信社区会纠正我的错误错了!
由于它不是惰性的,方法调用只是按顺序执行,而不是确定永远不需要调用哪些方法。
要达到相同的效果,您需要自己实现 "lazy" 行为。
if isFoo
{
foo()
}
else
{
bar()
}
或更简单地说:
isFoo ? foo() : bar()
Swift 有 lazy instantiation。也就是说,您可以告诉它变量在使用之前不应实例化。
在 Objective-C 中,这将需要开发人员手动实现此行为:
@property (nonatomic, strong) NSMutableArray *players;
- (NSMutableArray *)players
{
if (!_players)
{
_players = [[NSMutableArray alloc] init];
}
return _players;
}
在Swift中,这要简单得多,使用lazy
关键字即可实现:
lazy var players = [String]()
不知道这是不是你想要的,你可以使用函数作为类型
func foo() {
println("this is foo")
}
func bar() {
println("this is bar")
}
func maybeFooOrBar(isFoo: Bool) {
let myFoo = foo
let myBar = bar
let result = isFoo ? myFoo : myBar
result()
}
那么如果你callmaybeFooOrBar(true)
将打印第一个函数,callmaybeFooOrBar(false)
将打印第二个函数
此外,这可以以一种清晰的方式完成
func maybeFooOrBar(isFoo: Bool) {
(isFoo ? foo : bar)()
}
根据 leo 的回答,我找到了一个非常简单的解决方案
func foo(a: Int)() {
println("this is foo")
}
func bar(b: Int)() {
println("this is bar")
}
func maybeFooOrBar(isFoo: Bool) {
let myFoo = foo(1)
let myBar = bar(2)
isFoo ? myFoo() : myBar()
}
想知道是否可以懒惰地计算一个简单的 if 语句。下面是一个将打印 "this is foo" 和 "this is bar" 的示例,但我真的想让它只打印第一个字符串:
func foo() {
println("this is foo")
}
func bar() {
println("this is bar")
}
func maybeFooOrBar(isFoo: Bool) {
let myFoo = foo()
let myBar = bar()
isFoo ? myFoo : myBar
}
我找不到 Swift 不是惰性求值语言的规范证据,但我相信社区会纠正我的错误错了!
由于它不是惰性的,方法调用只是按顺序执行,而不是确定永远不需要调用哪些方法。
要达到相同的效果,您需要自己实现 "lazy" 行为。
if isFoo
{
foo()
}
else
{
bar()
}
或更简单地说:
isFoo ? foo() : bar()
Swift 有 lazy instantiation。也就是说,您可以告诉它变量在使用之前不应实例化。
在 Objective-C 中,这将需要开发人员手动实现此行为:
@property (nonatomic, strong) NSMutableArray *players;
- (NSMutableArray *)players
{
if (!_players)
{
_players = [[NSMutableArray alloc] init];
}
return _players;
}
在Swift中,这要简单得多,使用lazy
关键字即可实现:
lazy var players = [String]()
不知道这是不是你想要的,你可以使用函数作为类型
func foo() {
println("this is foo")
}
func bar() {
println("this is bar")
}
func maybeFooOrBar(isFoo: Bool) {
let myFoo = foo
let myBar = bar
let result = isFoo ? myFoo : myBar
result()
}
那么如果你callmaybeFooOrBar(true)
将打印第一个函数,callmaybeFooOrBar(false)
将打印第二个函数
此外,这可以以一种清晰的方式完成
func maybeFooOrBar(isFoo: Bool) {
(isFoo ? foo : bar)()
}
根据 leo 的回答,我找到了一个非常简单的解决方案
func foo(a: Int)() {
println("this is foo")
}
func bar(b: Int)() {
println("this is bar")
}
func maybeFooOrBar(isFoo: Bool) {
let myFoo = foo(1)
let myBar = bar(2)
isFoo ? myFoo() : myBar()
}