不能不安全地在不同大小的types之间进行快速的比较

当我尝试在数组中查找重复项时,出现错误“不能在不同大小的types之间使用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)") } 

find重复的方法我知道这个链接在这里input链接描述 。 我使用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) 

我怎样才能在我的项目中使用它?

 var mp3Files: Array<String!>! 

哇,这是很多惊叹号….他们不需要。

 var arrayForSearch = mp3Files as! [String] 

mp3Files的types永远不能和[String] ,所以你不能在它们之间强制转换(如果允许的话,会崩溃)。

您经常使用隐式解包选项。 他们只是在一些特殊情况下需要。 只要将mp3Files改为[String] (在这种情况下,你将不需要as! mp3Files你不应该经常需要as! )。

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

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

 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)") } } 

并在控制台中输出:

 filtered array [a, b, d, f] 

当你将你的数组转换为[String]时,会出现问题,所以再次检查它。