【问题标题】:Cannot use mutating member on immutable value sections is a let constant (swift3)不能在不可变值部分上使用 mutating 成员是一个 let 常量(swift3)
【发布时间】:2017-08-19 18:30:48
【问题描述】:

我在这段代码中找不到我的错误

对于sections.append(eventMois),我有以下错误消息

不能在不可变值部分上使用 mutating 成员是一个 let 常量

感谢您的帮助

 class DashboardViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, ExpandableHeaderViewDelegate {

     var sections : [Section]?

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.

        // Receive user defaults which we stored when user logged in

        let defaults = UserDefaults.standard
        let firstname = defaults.string(forKey: "usernameValue")
        let lastname = defaults.string(forKey: "nameValue")
        let connect_email = defaults.string(forKey: "emailValue")
        guard let eventMois = defaults.array(forKey: "event_mois") as? [Section] else {return}

        if let sections = sections {
            sections.append(eventMois)
        } else {
            sections = eventMois
        }

        }

【问题讨论】:

    标签: ios swift xcode swift3


    【解决方案1】:

    最有效的解决方案是将数组声明为非可选的空数组

    var sections = [Section]()
    

    那么整个if - let表达式就不需要了,你可以简单地写

    sections.append(eventMois)
    

    sections = eventMois
    

    在表达式中考虑

    if let sections = sections {
            sections.append(eventMois)
    
    第二行中的

    sections 是可选的绑定局部变量,不是声明的数组会导致错误,因为局部变量是不可变的。

    【讨论】:

    • 感谢您的解释,理解对我来说非常重要。我刚刚采取了sections = eventMois 你认为我可以将我的数组eventmois 放在section 中,因为eventmois 来自mysql。谢谢你的回答
    • 如果defaults.array(forKey: "event_mois") as? [Section] 成功sections = eventMois 很好。
    • 感谢您的帮助。我没有更多错误,但我的视图显示空白部分。我可能会验证数组的创建。谢谢
    • 您不能将对象从UserDefaults 直接转换为自定义类。你必须让Section采用NSCoding并使用NS(Key)Archiver
    • 您只能将属性列表兼容类型(NSStringNSNumberNSDateNSDataNSDictionary / NSArray 包含这 4 种类型)保存和读取到 UserDefaults。如果您能够将event_mois 写入UserDefaults,则必须读取相同的类型
    【解决方案2】:

    这是你的问题

    if let sections = sections {
                sections.append(eventMois)
            } else {
                sections = eventMois
            }
    

    在这里面 if let sections 是不可变的,正如 错误消息所说,你需要一个简单的 if != nil 检查

    用这个替换

    if sections != nil {
                sections.append(eventMois)
            } else {
                sections = eventMois
            }
    

    或者像这样的后卫

      guard sections != nil else{
             sections = eventMois
             return
         }
      sections.append(eventMois)
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2019-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-28
      • 1970-01-01
      • 1970-01-01
      • 2020-10-23
      相关资源
      最近更新 更多