【问题标题】:Swift Arrays of Multiple Types多种类型的 Swift 数组
【发布时间】:2014-06-13 19:22:03
【问题描述】:

我正在努力将 iOS Obj-C 项目一次转换为 Swift 一个类。一个 Obj-C 类涉及创建一个具有偶数元素描述性 NSStrings 和奇数元素 NSNumbers 的 NSArray。回想起来,这不是一个伟大的设计,但完全有效,它完成了工作。我已将其转换为 Swift:

let coins = ["1p", 0.01 , "2p" , 0.02 , "5p" , 0.05 , "10p" , 0.10 , "20p" , 0.20 , "50p" , 0.50 , "99p" , 0.99 ,  "£1" , 1.00 ,  "£2" , 2.00 , "£5" , 5.00 , "£9.99" , 9.99 , "£10" , 10.00 , "£20" , 20.00]

我确实意识到 Swift 在一维数组中强制执行单一类型,因此我们不会将多种类型的数组称为灵活类型的数组 - 我预计它会推断出 AnyObject。

然而,我从来没有发现,因为这条线似乎是 Xcode 杀手。在我的整个项目中,它会导致索引挂起,迅速变得无响应并最终消耗所有系统内存。即使将这一行代码粘贴到添加到空白单视图应用程序的 UIView 子类的 init 中,也会导致 Xcode 在尝试以类似方式构建时挂起(我很好奇其他人是否有相同的经验)。

鉴于它是可编译的代码,我在这里尝试的内容是否合法。如果是这样,我是否偶然发现了一个 Swift 错误,或者可能没有做一些重要的事情来让它工作。我显然可以找到一种更好的方法来做我想做的事,特别是在 Swift 中,但我不认为在 Obj-C 中很少看到多种类型的数组,这不值得进一步理解。

【问题讨论】:

  • 如果你改成let coins : AnyObject[] = ["1p", 0.01, ...会怎样?
  • 按照您的编写方式,它看起来更像是字典而不是数组。你有没有试过把它写成字典,用字符串或数字作为键,这取决于你将如何使用它。
  • 嘿,我也得到了同样的结果。当我将此行添加到我的 Playground 时,我看到 kernel_task 的内存使用量飙升至 10gb。一旦我强制退出 Xcode,它就会降到更正常的 1.4gb。我试过let coins: AnyObject[]let coins: Array<AnyObject>
  • 确定 AnyObject 是正确的类型吗?那不应该是任何吗? Array<Any>.convertFromArrayLiteral(1,1.2,"x")
  • 我同意它应该是 Any,但由于 Swift 的严格类型性质,我不确定它是否应该编译

标签: objective-c arrays xcode swift


【解决方案1】:

看起来您在 Xcode/Swift 中遇到了带有 Array<AnyObject> 和文字的错误。我得到相同的结果。我添加的元素越多,似乎会呈指数级恶化(我的 RAM 在大约 6 个元素后变满)。作为一种解决方法,创建一个可变数组(使用var 而不是let)并逐个添加元素似乎可以正常工作。 Janky 毫无疑问,但它不会使 Xcode 崩溃。

var coins: Array<AnyObject> = []
coins += "1p"
coins += 0.01
coins += "2p"
coins += 0.02
coins += "5p"
coins += 0.05
coins += "10p"
coins += 0.10
coins += "20p"
coins += 0.20
coins += "50p"
coins += 0.50
coins += "99p"
coins += 0.99
coins += "£1"
coins += 1.00
coins += "£2"
coins += 2.00
coins += "£5"
coins += 5.00
coins += "£9.99"
coins += 9.99
coins += "£10"
coins += 10.00
coins += "£20"
coins += 20.00

【讨论】:

    【解决方案2】:

    因为例如Int 是结构实例而不是类实例,类型是 Any[]

    var x : Any[] = [1,"2",3.0]
    

    【讨论】:

    • 完全同意它应该是,尽管当我检查单个元素时,我似乎记得它们是 NSString 和 NSNumber 的派生。也许 Swift 还不能正确推断数组中混合值类型的集合?
    • 问题可能是 swift 在 NSString 和 String 之间进行了奇怪的自动转换,在这种情况下可能会失败。
    猜你喜欢
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 2015-03-01
    相关资源
    最近更新 更多