【问题标题】:can't unsafeBitCast between types of different sizes in swift不能在 swift 中在不同大小的类型之间进行 unsafeBitCast
【发布时间】:2015-10-21 10:41:06
【问题描述】:

当我尝试在数组中查找重复项时,我收到错误“不能在不同大小的类型之间使用 unsafeBitCast”。我找到了以下方法的重复项。

    func uniq<S : SequenceType, T : Hashable where S.Generator.Element == T>(source: S) -> [T] {
    var buffer = [T]()
    var added = Set<T>()
    for elem in source {
        if !added.contains(elem) {
            buffer.append(elem)
            added.insert(elem)
        }
    }
    return buffer
}

func filter() {
    var arrayForSearch = mp3Files as! [String]
    var filteredArray = uniq(arrayForSearch)
    println("filtered array \(filteredArray)")
}

我在此链接enter link description here 上知道的查找重复项的方法。我使用 Xcode 6 和 Swift 1.2

这段代码中有数组。

var mp3Files: Array<String!>!
func exportData() {
    var generalURL: [AnyObject]?
    var arrayFiles: Array<NSURL!>!
    var directory = fileManager.URLsForDirectory(NSSearchPathDirectory.DocumentDirectory, inDomains: NSSearchPathDomainMask.UserDomainMask)
    var urlFromDirectory = directory.first as! NSURL

    var file = fileManager.contentsOfDirectoryAtURL(urlFromDirectory, includingPropertiesForKeys: nil, options: NSDirectoryEnumerationOptions.SkipsHiddenFiles, error: nil)!
    println("file \(file)")

    mp3Files = file.map(){ $0.lastPathComponent }.filter(){ $0.pathExtension == "mp3" }

  println("mp3 files  \(mp3Files)")
}

当我在操场上编写这段代码时,它可以工作。 一个例子

var array = ["Apple", "Mac", "iPhone", "iPad Air", "Apple", "Air", "Air"]
var filteredArray = Array(Set(array))

println(filteredArray)

如何在我的项目中使用它?

【问题讨论】:

    标签: ios arrays xcode swift


    【解决方案1】:
    var mp3Files: Array<String!>!
    

    哇,这有很多感叹号......他们不需要。

    var arrayForSearch = mp3Files as! [String]
    

    而且mp3Files 的类型永远不能与[String] 相同,所以你不能在它们之间强制转换(如果允许的话会崩溃)。

    您过于频繁地使用隐式展开的选项。仅在某些特殊情况下才需要它们。只需将mp3Files 更改为[String](在这种情况下,您根本不需要as!;您也不应该经常需要as!)。

    同样,arrayFiles(您从不使用)应该只是 [NSURL],而不是 Array&lt;NSURL!&gt;!

    【讨论】:

      【解决方案2】:

      我在这里尝试与您给出的相同的代码:

      import UIKit
      
      class ViewController: UIViewController {
      
          let strArr = ["a","b","a","d","f","f","b"]
      
          override func viewDidLoad() {
              super.viewDidLoad()
      
              filter()
          }
      
          func uniq<S : SequenceType, T : Hashable where S.Generator.Element == T>(source: S) -> [T] {
              var buffer = [T]()
              var added = Set<T>()
              for elem in source {
                  if !added.contains(elem) {
                      buffer.append(elem)
                      added.insert(elem)
                  }
              }
              return buffer
          }
      
          func filter() {
              var arrayForSearch = strArr
              var newArr = uniq(arrayForSearch)
              println("filtered array \(newArr)")
          }
      }
      

      OutPut 在控制台中:

      filtered array [a, b, d, f]
      

      当您将数组转换为 [String] 时出现问题,请再次检查。

      【讨论】:

      • 转换没有问题,因为 mp3Files 是 Array!
      • 尝试改变它的类型,比如[String]
      • 所以我在这里改了var arrayForSearch = mp3Files as! [字符串]
      • 声明mp3Files 的时候可以改一下吗?
      猜你喜欢
      • 1970-01-01
      • 2023-02-23
      • 2013-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多