NsMutable 不是 swift 中 [anyobject] 的子类型

Posted

技术标签:

【中文标题】NsMutable 不是 swift 中 [anyobject] 的子类型【英文标题】:NsMutable is not subtype of [anyobject] in swift 【发布时间】:2015-03-04 08:07:47 【问题描述】:

我想从NSUserdefault 获取数组并将其存储到NsMutableArray 但不幸的是它失败了。

错误

NsMutable is not subtype of [anyobject] in swift

代码

arrayImage  = NSUserDefaults.standardUserDefaults().arrayForKey("ImageArray") as NSMutableArray

我也在尝试像 this 帖子中那样沮丧 NSArray->NSString

【问题讨论】:

【参考方案1】:

NSUserDefaults arrayForKey 方法返回一个可选的 AnyObject 数组。如果您希望它是可变的,只需使用“var”声明它即可。// 示例:

var mutableArray  = NSUserDefaults.standardUserDefaults().arrayForKey("ImageArray")

如果你希望它是不可变的,你必须使用“let”来声明它。

let imutableArray  = NSUserDefaults.standardUserDefaults().arrayForKey("ImageArray")

如果您想确保您的方法在将任何值设置为 userdefaults 之前不返回 nil,您可以使用 nil 合并运算符“??”返回一个空数组,如下所示:

var mutableArray  = NSUserDefaults.standardUserDefaults().arrayForKey("ImageArray") ?? []

如果您想使用用户默认值存储图像,您必须首先将图像转换为 NSData。所以你应该创建一个方法类来帮助你:

class Save 
    class func image(key:String, _ value:UIImage) 
        NSUserDefaults.standardUserDefaults().setObject(UIImagePNGRepresentation(value), forKey: key)
    
    class func imageArray(key:String, _ value:[UIImage]) 
        NSUserDefaults.standardUserDefaults().setObject(NSKeyedArchiver.archivedDataWithRootObject(value), forKey: key)
    



class Load 
    class func image(key:String) -> UIImage! 
        return UIImage(data: ( NSUserDefaults.standardUserDefaults().objectForKey(key) as NSData))!
    
    class func imageArray(key:String) -> [UIImage]! 
        if let myLoadedData = NSUserDefaults.standardUserDefaults().dataForKey(key) 
            return (NSKeyedUnarchiver.unarchiveObjectWithData(myLoadedData) as? [UIImage]) ?? []
        
        return []
    


测试

let myProfilePicture1 = UIImage(data: NSData(contentsOfURL: NSURL(string: "http://i.stack.imgur.com/Xs4RX.jpg")!)!)!
let myProfilePicture2 = UIImage(data: NSData(contentsOfURL: NSURL(string: "https://lh6.googleusercontent.com/-Axxzrunya9Y/AAAAAAAAAAI/AAAAAAAAAHo/gsDxk5FlliE/photo.jpg")!)!)!

Save.image("myPic", myProfilePicture1)

let myLoadedPic = Load.image("myPic")

let myImageArray = [myProfilePicture1,myProfilePicture2]

Save.imageArray("myPicArray", myImageArray)

let myLoadedPicArray = Load.imageArray("myPicArray")

【讨论】:

我的 mutableArray [arrayImage] 是全局的( var arrayImage : NSMutableArray = [] )然后我从 NSUserdefualt 分配值,但我得到了这个错误 声明如下: var arrayImage:[UIImage] = [ ]【参考方案2】:

苹果文档说:

您也可以按照上面列出的相同桥接规则,直接从 Swift 数组字面量创建 NSArray 对象。当你将常量或变量显式键入为 NSArray 对象并为其分配一个数组字面量时,Swift 会创建一个 NSArray 对象而不是 Swift 数组。

这里有一个简单的例子:

let imageArray: [AnyObject]? = NSUserDefaults.standardUserDefaults().arrayForKey("ImageArray")
if let array = imageArray
    var arrayImage: NSArray  = array

【讨论】:

在我的情况下,arrayImage 是 MutableArray,因此它不会将 NSArray 分配给 MutableArray 有了 NSArray,那么你可以将 NSArray 转换为 NSMutableArray :)

以上是关于NsMutable 不是 swift 中 [anyobject] 的子类型的主要内容,如果未能解决你的问题,请参考以下文章

预期解码 Dictionary<String, Any> 但找到一个数组而不是 JSON SwiftUI

无法将“Swift.Array<Any>”类型的值转换为“Swift.Dictionary<Swift.String, Any>”

Dictionary<AnyHashable: Any> 在 Swift 3 中 Any 可能持有 nil 值

如何在 Swift 4 中访问 [UIApplicationOpenURLOptionsKey : Any] 的值?

类型“Any”没有下标成员/Swift 3 [重复]

Swift 中的 AnyObject 和 Any