有没有办法在Swift中对常量进行条件赋值?

时间:2016-12-03 16:40:49

标签: ios swift functional-programming

我想创建一个不可变值,根据条件分配不同的值。在Scala中,我可以编写以下内容:

    let attribs = if #available(iOS 8.2, *) {
        [ NSFontAttributeName: UIFont.systemFontOfSize(30, weight: UIFontWeightLight) ]
    } else {
        [ NSFontAttributeName: UIFont.systemFontOfSize(30) ]
    }

但是因为Swift if语句没有返回执行代码块的结果,所以不起作用。

如果测试是针对普通的Bool,我可以使用三元条件运算符

    let attribs = #available(iOS 8.2, *) ?
        [ NSFontAttributeName: UIFont.systemFontOfSize(30, weight: UIFontWeightLight) ]
    :
        [ NSFontAttributeName: UIFont.systemFontOfSize(30) ]

但这对iOS版本测试不起作用,我收到以下错误:

#available may only be used as condition of an 'if', 'guard' or 'while' statement.

我觉得我被一个var所困扰,但除非我也让它可选,否则我在大多数情况下会得到一个双重赋值,这看起来很丑陋且不必要?

    var attribs = [ NSFontAttributeName: UIFont.systemFontOfSize(30) ]
    if #available(iOS 8.2, *) {
        [ NSFontAttributeName: UIFont.systemFontOfSize(30, weight: UIFontWeightLight) ]
    }

感谢您的帮助!

3 个答案:

答案 0 :(得分:9)

在两个单独的行上做声明和作业:

let attribs: [String: Any]
if #available(iOS 8.2, *) {
    attribs = [NSFontAttributeName: UIFont.systemFontOfSize(30, weight: UIFontWeightLight)]
} else {
    attribs = [NSFontAttributeName: UIFont.systemFontOfSize(30)]
}

即使它是let,您也可以在单独的一行上进行分配(每个控制路径只能执行一次)。

答案 1 :(得分:4)

我想你想要这样的东西:

let value: String
if #available(iOS 9, *) {
    value = "iOS 9 is available"
} else {
    value = "iOS 9 and up only"
}
print(value) // iOS 9 is available

答案 2 :(得分:2)

您也可以这样做

var someConstant: String {
    if #available(iOS 9, *) {
        return "iOS 9"
    } else {
        return "not iOS 9"
    }
}

通过这样做,您无法为变量someConstant分配值,即使它是var而不是let,因为它是计算属性

另一种方法是使用自由函数。

let someConstant: String = {
    if #available(iOS 9, *) {
        return "iOS 9"
    } else {
        return "not iOS 9"
    }
}()

第二个示例中的第一个示例之间的区别在于第二个示例仅实例化一次。