"Not a 'subtype' error" 调用函数时
"Not a 'subtype' error" when calling function
我正在尝试加载一个包含相当大词典的 plist,将其打乱,然后保存打乱后的版本以供在应用程序中使用。我想我已经接近了,但是在尝试设置 experiments = shuffleArray(experiments)
.
时出现类型转换错误 'NSArray is not a subtype of 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)
}
}
有什么想法吗?
你 return Array<T>
来自 shuffleArray,但是 Array<T>
不是 NSMutableArray
的子类型,所以你不能将它分配给 experiments
变量。
如果你真的需要泛型,你应该对它们都使用Array<T>
(除非你有一个包含不同类型对象的异构数组,但这种情况非常罕见,你应该仔细考虑它是否是什么你想要)。
假设您知道所有类型都是Int、String 或一些自定义类型(例如 class Experiment),您应该使用类型化数组,即 Array<Int>
或 Array<String>
或 Array<Experiment>
用于 experiments
并且仅使用shuffleArray 的通用形式 Array<T>
。
我正在尝试加载一个包含相当大词典的 plist,将其打乱,然后保存打乱后的版本以供在应用程序中使用。我想我已经接近了,但是在尝试设置 experiments = shuffleArray(experiments)
.
相关代码如下:
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)
}
}
有什么想法吗?
你 return Array<T>
来自 shuffleArray,但是 Array<T>
不是 NSMutableArray
的子类型,所以你不能将它分配给 experiments
变量。
如果你真的需要泛型,你应该对它们都使用Array<T>
(除非你有一个包含不同类型对象的异构数组,但这种情况非常罕见,你应该仔细考虑它是否是什么你想要)。
假设您知道所有类型都是Int、String 或一些自定义类型(例如 class Experiment),您应该使用类型化数组,即 Array<Int>
或 Array<String>
或 Array<Experiment>
用于 experiments
并且仅使用shuffleArray 的通用形式 Array<T>
。