Swift - Xcode 9.4.1 - AnyObject 不是 NSArray 的子类型
Swift - Xcode 9.4.1 - AnyObject is not a subtype of NSArray
下面的代码在两年前工作得很好。
Xcode 更新后出现 "AnyObject is not a subtype of NSArray" 错误。谁能帮我修好它?
override func viewWillAppear(_ animated: Bool) {
if let storednoteItems : AnyObject = UserDefaults.standard.object(forKey: "noteItems") as AnyObject? {
noteItems = []
for i in 0 ..< storednoteItems.count += 1 {
// the above line getting Anyobject is not a subtype of NSArray error
noteItems.append(storednoteItems[i] as! String)
}
}
}
您将 storednoteItems
键入为 AnyObject
,但随后您试图对其调用 count
,并尝试对其下标。看起来你真正想要的是 storednoteItems
是一个数组,那么为什么不这样输入呢?而不是 as AnyObject?
,只需使用 as? [String]
键入 storednoteItems
即可成为字符串数组。然后删除类型上的 : AnyObject
声明,您的数组将按您预期的方式运行。
您根本不应该对 Swift 中的值类型使用 AnyObject
和 NSArray
。而且你不应该注释编译器可以推断的类型。
UserDefaults
有一个专门的方法 array(forKey
来获取数组。
您的代码可以缩减为
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated) // this line is important. Don't forget to call super.
if let storednoteItems = UserDefaults.standard.array(forKey: "noteItems") as? [String] {
noteItems = storednoteItems
}
}
并声明 noteItems
为
var noteItems = [String]()
如果指定循环的类型,则不需要在循环中进行任何类型转换。
更新到较新的版本试试这个..
if let storednoteItems = UserDefaults.standard.object(forKey: "noteItems") as? [String] {
var noteItems = [String]()
for i in 0 ..< storednoteItems.count{
noteItems.append(storednoteItems[i])
}
}
使用 foreach
循环效率更高,只需将循环替换为以下循环即可。
for item in storednoteItems{
noteItems.append(storednoteItems[i])
}
下面的代码在两年前工作得很好。
Xcode 更新后出现 "AnyObject is not a subtype of NSArray" 错误。谁能帮我修好它?
override func viewWillAppear(_ animated: Bool) {
if let storednoteItems : AnyObject = UserDefaults.standard.object(forKey: "noteItems") as AnyObject? {
noteItems = []
for i in 0 ..< storednoteItems.count += 1 {
// the above line getting Anyobject is not a subtype of NSArray error
noteItems.append(storednoteItems[i] as! String)
}
}
}
您将 storednoteItems
键入为 AnyObject
,但随后您试图对其调用 count
,并尝试对其下标。看起来你真正想要的是 storednoteItems
是一个数组,那么为什么不这样输入呢?而不是 as AnyObject?
,只需使用 as? [String]
键入 storednoteItems
即可成为字符串数组。然后删除类型上的 : AnyObject
声明,您的数组将按您预期的方式运行。
您根本不应该对 Swift 中的值类型使用 AnyObject
和 NSArray
。而且你不应该注释编译器可以推断的类型。
UserDefaults
有一个专门的方法 array(forKey
来获取数组。
您的代码可以缩减为
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated) // this line is important. Don't forget to call super.
if let storednoteItems = UserDefaults.standard.array(forKey: "noteItems") as? [String] {
noteItems = storednoteItems
}
}
并声明 noteItems
为
var noteItems = [String]()
如果指定循环的类型,则不需要在循环中进行任何类型转换。
更新到较新的版本试试这个..
if let storednoteItems = UserDefaults.standard.object(forKey: "noteItems") as? [String] {
var noteItems = [String]()
for i in 0 ..< storednoteItems.count{
noteItems.append(storednoteItems[i])
}
}
使用 foreach
循环效率更高,只需将循环替换为以下循环即可。
for item in storednoteItems{
noteItems.append(storednoteItems[i])
}