【问题标题】:How to transform this statement for better performance如何转换此语句以获得更好的性能
【发布时间】:2017-08-15 08:42:20
【问题描述】:

由于我在代码中添加了以下行,因此在构建时性能非常差(索引需要 5 到 7 分钟)。

var valuesToPassToDetailViewController = [[String:[String: Any]]]()
var dict = [String:[String: Any]]()
dict = [title as! String:["title":title as! String, "valueD":postValue["value"] ?? "", "valueD":postValue["value"] ?? "","valueD":postValue["value"] ?? "","valueD": postValue["value"] ?? "","valueD": postValue["value"] ?? "","valueD":postValue["value"] ?? "","valueD":postValue["value"] ?? "" ,"valueD": postValue["value"] ?? "", "valueD": postValue["value"] ?? ""]]
self.valuesToPassToDetailViewController.append(dict)

请记住 valueD 是 Key 的替换,当然 Key 具有不同的键值,并且 value 与上面的替换相同。

请帮我解决这个问题。感谢您的每一个回复。

【问题讨论】:

  • 我认为表达式是,引用 Playground,太复杂而无法在合理时间内解决,请考虑将表达式分解为不同的子表达式。
  • 而且,我知道这不是您想要的,但这是重新审视这个非常好奇的模型的绝佳机会。
  • 我不确定您是否只是出于演示目的复制了相同的重复值,但在当前形式下,此代码甚至无法编译,因为字典不能有重复键。
  • 是的,它是为了演示

标签: arrays swift swift3


【解决方案1】:

(除了是一种糟糕的代码实践之外)由于大量嵌套文字,您编写的代码会被 Swift 编译器严重处理。 (也发生在其他代码中。) 更简单的解决方案:

因为您重复使用相同的值:

let nonNullValue = postValue["value"] ?? ""

dict = [title as! String : ["title":title,
                            "valueD": nonNullValue,
                            "valueD": nonNullValue,
                            "valueD": nonNullValue,
                            "valueD": nonNullValue,
                            "valueD": nonNullValue,
                            "valueD": nonNullValue,
                            "valueD": nonNullValue ,
                            "valueD": nonNullValue,
                            "valueD": nonNullValue]]

会做的。

如果允许,一些编码说明:

  • 使用 var 重复值,这样做不仅使编译器满意,而且通常更快(尤其是如果您使用 a.b.c.d() 会产生调用/返回..)

  • 不要在控件之间传递通用结构,当读取/下载时,创建您的类/结构并传递它们。

  • 最好动态添加到 dict,如果您必须从磁盘/网络等读取数据,这将很容易。

希望这能有所帮助。

另一个建议:

以这种方式传递给 typealias:

typealias Dict = [[String:[String: Any]]]

所以你可以写:

    var valuesToPassToDetailViewController2 = Dict()

反测试:

    var valuesToPassToDetailViewController = [[String:[String: Any]]]()
    var valuesToPassToDetailViewController2 = Dict()

    valuesToPassToDetailViewController2 = valuesToPassToDetailViewController

【讨论】:

  • 是的,这也有效,但我决定为我的目的创建结构。但由于复杂性,我将您的答案标记为解决方案。
  • 很高兴听到这个消息。我想以后如果使用这种方法你会很头疼。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-19
  • 2021-08-27
  • 2021-02-19
相关资源
最近更新 更多