[英]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. 我想从NSUserdefault
获取数组并将其存储到NsMutableArray
但是不幸的是它失败了。
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. 我也在尝试像这篇文章一样向下转换NSArray->NSString
。
The NSUserDefaults arrayForKey method returns an optional array of AnyObject. NSUserDefaults arrayForKey方法返回一个可选的AnyObject数组。 It you want it to be mutable just declare it using "var".// example: 您希望它是可变的,只需使用“ var”声明它即可。//示例:
var mutableArray = NSUserDefaults.standardUserDefaults().arrayForKey("ImageArray")
If you want it to be immutable you have to declare it using "let". 如果您希望它是不可变的,则必须使用“ 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 "??" 如果要确保在将任何值设置为userdefaults之前您的方法不返回nil,则可以使用nil合并运算符“ ??” 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. 如果要使用用户默认值存储图像,则必须首先将图像转换为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. 您还可以遵循上述相同的桥接规则,直接从Swift数组文字创建NSArray对象。 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. 当您显式地将常量或变量键入NSArray对象并为其分配数组常量时,Swift将创建NSArray对象而不是Swift数组。
A brief example here: 这里有一个简单的例子:
let imageArray: [AnyObject]? = NSUserDefaults.standardUserDefaults().arrayForKey("ImageArray")
if let array = imageArray{
var arrayImage: NSArray = array
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.