【问题标题】:is it good practice to Any element type in swift?快速使用任何元素类型是一种好习惯吗?
【发布时间】:2019-05-30 21:59:52
【问题描述】:

swift 中的任何元素类型都是好习惯吗?

例如

let arrayObject = [Any]

let arrayObject  = [[String: String]]

【问题讨论】:

  • 取决于您的要求或您要存储的任何动态数据或标准数据!
  • 一个好的做法是尽可能避免Any
  • 问问自己这个。使用[Any] 可以获得什么?
  • @RakeshaShastri 更好的问题是:使用[Any]会损失多少
  • @DávidPásztor 如果他试图有效地使用Any,他必须衡量收益而不是损失。如果有损失,他甚至不会考虑这个选项。所以,我相信我的措辞正确。 (我知道您正在挖掘 Any 的用法,但我认为它不适合这里的上下文。:x)

标签: arrays swift generics


【解决方案1】:

Swift 的强类型系统鼓励您始终尽可能地使用特定类型。请不要将Any 用作无关类型。

我建议考虑这个优先级列表(从高到低)

  1. 如果类型已知且同质,请使用静态类型。
    例如,在 JSON 字典中,如果所有值都是 String,则始终使用 [String:String] 而不是 [String:Any]
  2. 如果类型是异构的(例如数组中的对象)并且仅包含少数已知类型,则使用通用协议。
  3. 尝试使用泛型。
  4. 使用Any

【讨论】:

    【解决方案2】:

    当您知道 Array 元素的类型时,您可以避免使用 Any 并使用直接数据类型。

    例如:如果你持有String的数组,你可以直接定义String类型如下。

    var arrayObject = [String]()
    

    如果您在数组中持有未知类型的对象或在数组中持有多种类型的对象,您可以使用Any

    例如:如果您将StringNSNumber 放在同一个数组中,则可以将Any 定义为数组元素的类型,如下所示。

    var arrayObject = [Any]()
    arrayObject.append("Hundred")
    arrayObject.append(NSNumber(value: 100))
    
    let str = arrayObject[0] as! String
    let number = arrayObject[1] as! NSNumber
    

    【讨论】:

    • 可以,但你应该Any 是最糟糕的选择。例如,您可以将包含StringNSNumber 的数组声明为[CustomStringConvertible],这比[Any] 好一百倍。
    • 如果我们不应该使用Any 并且是最糟糕的选择,为什么Swift 有这样的类型?我只是举了一个基本的例子,另一个例子是Bundle.main.loadNibNamed("CustomCell", owner: nil, options: nil),这里loadNibNamed函数返回Any的数组。所以在这一点上是有意义的。对吗?
    猜你喜欢
    • 2019-10-06
    • 2016-07-01
    • 1970-01-01
    • 2017-06-14
    • 2016-02-10
    • 1970-01-01
    • 2019-03-06
    • 2013-03-30
    • 2015-09-02
    相关资源
    最近更新 更多