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

时间:2015-03-04 08:07:48

标签: ios swift nsuserdefaults

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

错误

NsMutable is not subtype of [anyobject] in swift

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

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

2 个答案:

答案 0 :(得分:2)

NSUserDefaults arrayForKey方法返回AnyObject的可选数组。你希望它是可变的只是使用“var”来声明它.//例如:

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

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

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

如果你想确保你的方法在为userdefaults设置任何值之前没有返回nil,你可以使用nil coalescing运算符“??”返回一个空数组如下:

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

答案 1 :(得分:0)

Apple doc说:

  

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

这里有一个简短的例子:

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