"不是'子类型'错误"在调用函数时

时间:2015-02-27 13:32:26

标签: ios swift casting

我正在尝试加载包含相当大字典的plist,将其随机播放,然后保存随机播放的版本以便在应用中使用。我想我已经关闭了,但是我遇到了类型转换错误,当尝试设置experiments = shuffleArray(experiments)时,NSArray不是NSMutableArray的子​​类型。

以下是相关代码:

var experiments = NSMutableArray()
var menuIndex = 0

override init() {
    super.init()
    // Create the data model.
    func shuffleArray<T>(var array: Array<T>) -> Array<T>
    {
        for var index = array.count - 1; index > 0; index--
        {
            // Random int from 0 to index-1
            var j = Int(arc4random_uniform(UInt32(index-1)))

            // Swap two array elements
            // Notice '&' required as swap uses 'inout' parameters
            swap(&array[index], &array[j])
        }
        return array
    }
    if let path = NSBundle.mainBundle().pathForResource("experiments", ofType: "plist") {
        if let dict = NSDictionary(contentsOfFile: path) {
            experiments.addObjectsFromArray(dict.objectForKey("experiments") as NSArray)

            experiments = shuffleArray(experiments)
        }
    }

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您从shuffleArray返回Array<T>,但Array<T>不是NSMutableArray的子类型,因此您无法将其分配给experiments变量。

如果你真的需要泛型,你应该对它们使用Array<T>(除非你有一个具有不同类型对象的异源阵列,但这是非常罕见的,你应该仔细考虑它是否是你想要的)。

假设您知道所有类型都是例如Int,String或某些自定义类型(比如类实验),您应该使用类型数组,即Array<Int>Array<String>Array<Experiment> experiments,并且只使用泛型形式{{ 1}}用于shuffleArray。