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