不能在swift中使用不同大小的类型之间的unsafeBitCast

时间:2015-07-30 07:25:16

标签: ios arrays xcode swift

当我尝试在数组中找到重复项时,我得到错误“不能在不同大小的类型之间进行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)

我如何在项目中使用它?

2 个答案:

答案 0 :(得分:2)

var mp3Files: Array<String!>!
哇,这有很多感叹号......他们不需要。

var arrayForSearch = mp3Files as! [String]

mp3Files的类型永远不能与[String]相同,因此您无法在它们之间强制转换(如果它允许您会崩溃)。

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

同样,arrayFiles(您永远不会使用),应该是[NSURL],而不是Array<NSURL!>!

答案 1 :(得分:0)

在这里,我尝试使用相同的代码:

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]时,我遇到了问题,请再次检查。