我如何创建一个常量,它可以是几个字符串中的一个,这取决于条件



我想使用一个常数let,它可能是几个值中的一个。

例如:

if condition1 {
   constant = "hi"
}
else if condition2 {
   constant = "hello"
}
else if condition3 {
   constant = "hey"
}
else if condition4 {
   constant = "greetings"
}

我不知道如何用Swift和let功能做到这一点。但我倾向于相信这是可能的,因为这是Swift的书:

使用let来创建常量,使用var来创建变量。在编译时不需要知道常量的值,但必须只给它赋一次值。

我该如何做到这一点?

正如其他答案所指出的那样,您不能直接这样做。但如果你只是想用变量设置一个常数的初始值,那么是的,这是可能的。下面是一个计算属性的例子。

class MyClass {
    let aConstant: String = {
        if something == true {
            return "something"
        } else {
            return "something else"
        }
    }()
}

我想你是在寻找稍后会在switch-case中分配的变量:

let constant :String
switch conditions {
case condition1:
    constant = "hi"
case condition2:
    constant = "hello"
case condition3:
    constant = "hey"
case condition4:
    constant = "greetings"
default:
    constant = "salute"
}

一个选项是这样的,使用闭包:

let constant: String = ({ value in
    if conditionOne {
        return "Hi"
    } else if conditionTwo {
        return "Bye"
    }
    return "Oops!"
})(myData /*needed for condition*/)

或者,换一种方式,使用泛型:

func fancySwitch<S, T>(val: S, fn: S -> T) -> T {
    return fn(val)
}
let x: String = fancySwitch(3) { val in
    if val == 2 {
        return "Hi"
    } else if val < 5 {
        return "Bye"
    }
    return "Oops"
}
let y: String = fancySwitch((3, 4)) { (a, b) in
    if a == 2 {
        return "Hi"
    } else if b < 5 {
        return "Bye"
    }
    return "Oops"
}

我明白你在找什么。在Scala和其他函数式语言中,这可以使用match语句(有点像switch)来完成,因为整个语句解析为这样的值:

val b = true
val num = b match {
  case true => 1
  case false => 0
}
不幸的是,这在Swift中是不可能直接实现的,因为没有办法从分支语句中获取值。正如Swift书中所述,"Swift有两个分支语句:if语句和switch语句。"这两个语句都不能解析为一个值。

我能想到的最接近的代码结构是首先使用一个变量来检索正确的值,然后将其赋值给一个常数,以便在以后的任何代码中使用:

let b = true
var num_mutable: Int
switch b {
case true:
    num_mutable = 1
default:
    num_mutable = 0
}
let num = num_mutable

只需在if/else语句之前添加let constant: String行。

下面是Swift 1.2和Xcode 6.3测试版的摘录- Swift Blog - Apple Developer详细说明。

let 常量现在更强大和一致 -新规则是let常量在使用前必须初始化(就像var一样),并且它只能被初始化,之后不能被重新赋值或改变初始化。这支持如下模式:

let x : SomeThing
if condition {
  x = foo()
} else {
  x = bar()
}
use(x)

这以前需要使用var,即使没有突变发生了。属性被折叠到这个模型中简化它们在初始化式中的语义。

我从上面的文章"Let It Go: Let in Swift的延迟初始化"中找到了Swift的博客文章,我通过谷歌找到了:Swift Let constant conditional initialize。

相关内容

最新更新