【问题标题】:In Swift, Array [String] slicing return type doesn't seem to be [String]在 Swift 中,Array [String] 切片返回类型似乎不是 [String]
【发布时间】:2017-06-01 11:49:52
【问题描述】:

我正在对字符串数组进行切片并将其设置为 [String] 变量,但类型检查器正在抱怨。这可能是编译器错误吗?

var tags = ["this", "is", "cool"]
tags[1..<3]
var someTags: [String] = tags[1..<3]

【问题讨论】:

    标签: ios swift sub-array


    【解决方案1】:

    用范围下标数组不会返回数组,而是切片。不过,您可以从该切片中创建一个数组。

    var tags = ["this", "is", "cool"]
    tags[1..<3]
    var someTags: Slice<String> = tags[1..<3]
    var someTagsArray: [String] = Array(someTags)
    

    【讨论】:

    • 您在哪里找到 Slice 的文档?此外,错误消息不正确,Slice 在操场上显示为 [String]。因此,似乎有两个编译器错误和缺少文档。
    • 这里可以看到subscipt方法的定义:developer.apple.com/library/prerelease/ios/documentation/…
    • 我同意错误是不正确的,文档可能需要一些工作。如果您分两步尝试:var someTags = tags[1..&lt;3] var someTagsArray: [String] = someTags 它会给您更多帮助error: 'Slice&lt;String&gt;' is not convertible to '[String]'
    • 我的错,我看的是 Swift iBooks。我认为 Apple 应该删除它们以保持它们是最新的。
    • 使用 Swift 3 我在第三行出现错误,“Type 'String' does not conform to protocol 'indexable'”。
    【解决方案2】:
    var tags = ["this", "is", "cool"]
    var someTags: [String] = Array(tags[1..<3])
    println("someTags: \(someTags)") // "someTags: [is, cool]"
    

    【讨论】:

      【解决方案3】:

      您也可以这样做来获取切片的新数组:

      var tags = ["this", "is", "cool"]
      var someTags = [String]()
      someTags += tags[1..<3]
      println(someTags[0])  //prints ["is", "cool"]
      

      【讨论】:

      • 没关系,但很混乱。
      • 我预计它会打印“is”
      【解决方案4】:

      在一个地方执行此操作的另一种方法是组合变量声明 let someTags: [String]map(_:),这会将 ArraySlice&lt;String&gt; 转换为 [String]

      let tags = ["this", "is", "cool"]
      let someTags: [String] = tags[1..<3].map { $0 } // ["is", "cool"]
      

      【讨论】:

        【解决方案5】:

        另一种将ArraySlice 转换为Array 的便捷方法是:

        var tags = ["this", "is", "cool"] var someTags: [String] = tags[1..<3] + []

        它并不完美,因为稍后查看它的其他开发人员(或您自己)可能不理解它的用途。好消息是,如果该开发人员(也许是您)删除了+ [],他们将立即遇到编译器错误,这有望阐明其目的。

        【讨论】:

          【解决方案6】:

          只需在创建切片时将其转换为数组即可。将您的 Array 保留为数组,而无需使用中间变量。这在使用 Codable 类型时非常有用。

          var tags = ["this", "is", "cool"]
          tags = Array(tags[1..<3])
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-01-10
            • 2022-07-22
            • 2017-01-29
            • 2020-08-17
            • 2012-07-16
            • 1970-01-01
            相关资源
            最近更新 更多