我想使用一个常数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。