代码之家  ›  专栏  ›  技术社区  ›  arlomedia

从Objective-C中的引用复制到Swift中的值复制的策略

  •  0
  • arlomedia  · 技术社区  · 4 年前

    我正在将一个项目从Objective-C转换为Swift,并且由于NSDictionary是通过引用复制的类,而Dictionary是通过值复制的结构,因此遇到了很多bug。下面是一个简化的例子:

    var recentMessages = [String: [String]]()
    
    func logMessage(_ message: String, forChannel channel: String) {
        let channelMessages = self.recentMessages[channel]
        channelMessages.append(message)
    }
    

    在Objective-C中,这更新了 recentMessages 财产。在Swift中,这只会更新 channelMessages 函数作用域中的变量,我必须将更改复制回属性:

    var recentMessages = [String: [String]]()
    
    func logMessage(_ message: String, forChannel channel: String) {
        let channelMessages = self.recentMessages[channel]
        channelMessages.append(message)
        self.recentMessages[channel] = channelMessages
    }
    

    这种变通方法并不难,而且 this answer 四年前称之为最佳方法。但它增加了很多混乱,我害怕每次都忘了应用它。有没有一种方法可以更直接地复制之前的行为?

    我可以避免创建局部变量并直接更新属性,但这似乎是一个很大的限制,在更复杂的情况下会使代码难以阅读:

    var recentMessages = [String: [String]]()
    
    func logMessage(_ message: String, forChannel channel: String) {
        self.recentMessages[channel].append(message)
    }
    

    在字典将被重复使用并且具有可预测键的情况下,我认为创建一个具有支持所有键的属性的自定义类可以解决这个问题。但我也有一些地方,字典可以包含未预定义的任意键,或者字典只被短暂使用,为它创建一个类会被过度使用。

    我缺少另一种方法来恢复我当前代码库所依赖的“引用复制”行为吗?

    0 回复  |  直到 4 年前