简体   繁体   中英

NsMutable is not subtype of [anyobject] in swift

I want to get the array from NSUserdefault and store it into NsMutableArray but unfortunately it fails.

error

NsMutable is not subtype of [anyobject] in swift

code

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

I am also trying to do downcast NSArray->NSString like in this post.

The NSUserDefaults arrayForKey method returns an optional array of AnyObject. It you want it to be mutable just declare it using "var".// example:

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

If you want it to be immutable you have to declare it using "let".

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

If you want to make sure your method does not return nil before setting any value to userdefaults you can use the nil coalescing operator "??" to return an empty array as follow:

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

If you want to store images using user defaults you have to first convert your image to NSData. So you should create a method class to help you with it:

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 []
    }

}

Testing

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

Apple doc says:

You can also create an NSArray object directly from a Swift array literal, following the same bridging rules outlined above. When you explicitly type a constant or variable as an NSArray object and assign it an array literal, Swift creates an NSArray object instead of a Swift array.

A brief example here:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM