Ios can';在swift中不同大小的类型之间进行不安全的Bitcast

Ios can';在swift中不同大小的类型之间进行不安全的Bitcast,ios,arrays,xcode,swift,Ios,Arrays,Xcode,Swift,当我试图在数组中查找重复项时,会出现错误“无法在不同大小的类型之间取消安全位广播”。我通过以下方法找到重复项 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

当我试图在数组中查找重复项时,会出现错误“无法在不同大小的类型之间取消安全位广播”。我通过以下方法找到重复项

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

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

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

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)")
    }
}
当您将数组强制转换为
[String]
时,可能会出现问题,请再次检查

var mp3Files: Array<String!>!
而且
mp3文件的类型
永远不能与
[String]
相同,因此不能在它们之间强制强制强制转换(如果允许的话,会崩溃)

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


类似地,
arrayFiles
(您从未使用过),应该只是
[NSURL]
,而不是
数组

强制转换没有问题,因为MP3文件是数组!尝试更改它的类型,如
[String]
,因此我在这里将其更改为var arrayForSearch=mp3Files as![String]您可以在声明时更改
mp3文件的类型吗?
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]
var mp3Files: Array<String!>!
var arrayForSearch = mp3Files as! [String]