不能不安全地在不同大小的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]
时,会出现问题,所以再次检查它。