懒惰函数评估在swift中

时间:2015-06-10 10:39:49

标签: ios swift if-statement functional-programming lazy-evaluation

想知道是否有可能懒惰地评估一个简单的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
}

3 个答案:

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