【问题标题】:Swift optional binding only allows constantsSwift 可选绑定只允许常量
【发布时间】:2026-01-07 06:55:02
【问题描述】:

Swift 带有一个“可选绑定”机制,允许在可能的情况下自动解包可选值。刚开始学这个的时候看起来还可以,但是后来发现可选绑定机制只能将解包后的值绑定到常量上。

如果我想修改解包后的值,我必须先将它分配给一个变量..

if let regions:[String] = regionList {
    regions.removeLast() //Error!
}

有没有更好的方法来解决这个问题?

我希望 Apple 可以提供另一种可选的绑定语法,例如:

if var regions:[String] = regionList {
    ...
}

【问题讨论】:

    标签: swift swift2


    【解决方案1】:

    if var 技术存在,但该值仅在if var 范围内是可变的,并且无论如何它都是一个副本,因为数组是值类型。

    var regionList:[String]? = ["a", "b"]
    
    if var regions = regionList {
        regions.removeLast()
        regions  // ["a"]
    }
    
    regionList  // ["a", "b"]
    

    要改变你的可选数组,你可以使用可选链:

    var regionList:[String]? = ["a", "b"]
    
    regionList?.removeLast()
    
    regionList  // ["a"]
    

    这里的想法是 .removeLast() 只会在 regionList? 不是 nil 时执行。

    【讨论】:

    • regionList?.removeLast() 这有点棘手,我不清楚未来的开发人员会很容易理解原因和结果。 IMO 明确是避免未来混淆和错误的更好方法。
    • 感谢您的回复!我实际上尝试了这种if var 语法......但Xcode 似乎存在一些问题。如果我将原始代码从if let 更改为if var,那么它会总是 向我显示一条错误消息,如图imgur.com/IUDh5RM 所示,我被这个奇怪的错误阻止了。 ..现在我尝试实际编译它,它可以工作!
    • @zaph 我明白你的意思,但可选链接在 IMO 中一点也不棘手。 (但我想这是一个品味问题)。 Apple 甚至有一个 whole 页面介绍它以及如何使用它。
    • 关于可选链的建议,不适合我的实际情况。我只是简化它,以便更容易解释我的问题:)
    • @Jung-ShuoPai 好的,我明白了。没问题。 :)
    【解决方案2】:

    你可以只检查数组是否为零:

    var regionList:[String]? = ["a", "b"]
    
    if regionList != nil {
        regionList!.removeLast() // you can safely force unwrap it here
    }
    

    【讨论】: