我如何根据条件创建一个可能是多个字符串之一的常量?

时间:2014-06-10 04:34:58

标签: swift

我希望使用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生成变量。在编译时不需要知道常量的值,但是必须为其分配一次值。

我将如何做到这一点?

6 个答案:

答案 0 :(得分:8)

正如其他答案所指出的,你不能直接这样做。但是,如果你只是想要改变一个常数的初始值,那么是的,这是可能的。这是一个带有计算属性的例子。

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

答案 1 :(得分:2)

我认为您正在寻找一个可选项,稍后将在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"
}

答案 2 :(得分:2)

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

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"
}

答案 3 :(得分:2)

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

val b = true
val num = b match {
  case true => 1
  case false => 0
}

遗憾的是,这在Swift中是不可能的,因为无法从分支语句中获取值。正如Swift一书中所述,&#34; Swift有两个分支语句:if语句和switch语句。&#34;这些陈述都没有解析为某个值。

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

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

答案 4 :(得分:2)

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

下面,摘录自Swift 1.2 and Xcode 6.3 beta - Swift Blog - Apple Developer

  

let 常量变得更加强大和一致-新规则是   let常量必须在使用之前进行初始化(例如var),并且   它只能被初始化,之后不能重新分配或变异   初始化。这样可以启用以下模式:

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

这以前需要使用var,即使没有   发生突变。属性已折叠到此模型中,以   也简化了初始化程序中的语义。

我在上面的文章“ Let It Go: Late Initialization of Let in Swift”中找到了我的Swift博客文章,该文章是通过谷歌搜索发现的:swift let常量条件初始化。

答案 5 :(得分:0)

一种方法是:

var myVariable: String!

if condition1 {
    myVariable = "hi"
} else {
    myVariable = "bye"
}

let myConstant = myVariable