想知道是否有可能懒惰地评估一个简单的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
}
答案 0 :(得分:4)
不知道这是否是您想要的,您可以将功能用作类型
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)()
}
答案 1 :(得分:1)
我无法找到 Swift不是一种懒惰的评估语言的规范证据,但我确信如果我错了,社区会纠正我!
由于它不是惰性的,方法调用只是按顺序执行,而不是确定永远不需要调用哪些方法。
要达到同样的效果,您需要自己实现“懒惰”行为。
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]()
答案 2 :(得分:0)
我在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()
}