no puede ser inseguro BitCast entre types de diferentes tamaños en swift

cuando trato de encontrar duplicates en la matriz, obtengo el error "No puede ser inseguro BitCast entre types de diferentes tamaños". Encuentro los duplicates siguiendo el método.

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 filtenetworkingArray = uniq(arrayForSearch) println("filtenetworking array \(filtenetworkingArray)") } 

El método de search duplicates que conocía en este enlace ingrese la descripción del enlace aquí . Yo uso Xcode 6 y Swift 1.2

Existe la matriz en este código.

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

Cuando escribí este código en el patio de juegos funciona. Un ejemplo

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

¿Cómo puedo usarlo en mi proyecto?

 var mp3Files: Array<String!>! 

Vaya, son muchos los signos de exclamación … No son necesarios.

 var arrayForSearch = mp3Files as! [String] 

Y el tipo de mp3Files nunca puede ser el mismo que [String] , por lo que no puede forzarlos entre ellos (y se bloquearía si lo permitiera).

Está utilizando opciones opcionales implícitamente demasiado a menudo. Solo se necesitan en algunos casos especiales. Simplemente cambie mp3Files a [String] (en cuyo caso, no necesitará el as! En absoluto; tampoco debería necesitarlo as! ).

De manera similar, arrayFiles (que nunca usa), debería ser [NSURL] , no Array<NSURL!>! .

Aquí trato el mismo código que has dado:

 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("filtenetworking array \(newArr)") } } 

Y OutPut en la console:

 filtenetworking array [a, b, d, f] 

Mi estar allí es un problema cuando estás lanzando tu matriz a [String] así que compruébalo una vez más.