简体   繁体   English

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

[英]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.

相关问题 Swift-[NSObject:AnyObject]! 不是“字典”的子类型 <String, AnyObject> - Swift - [NSObject : AnyObject]!' is not a subtype of 'Dictionary<String, AnyObject> Swift 3-排序数组/字典:&#39;(AnyObject)&#39;不是&#39;NSString&#39;的子类型 - Swift 3 - Sorting array/dictionary: '(AnyObject)' is not a subtype of 'NSString' 转换为Swift 3后发生错误(AnyObject不是UIFontDescriptor的子类型) - Error after converting to Swift 3 ( AnyObject is not a subtype of UIFontDescriptor ) swift3中的编译错误:“ AnyObject”不是“ NSObject”的子类型 - Compilation error in swift3: 'AnyObject' is not a subtype of 'NSObject' “AnyObject? 不是CustomClass的子类型 - 'AnyObject?' is not a subtype of CustomClass 复杂线警告:AnyObject不是NSObject的子类型 - Complex line warns: AnyObject is not a subtype of NSObject 使用AFNetworking时,指示“Anyobject”不是“NSProxy”的子类型 - Indicated 'Anyobject' is not a subtype of 'NSProxy' when using AFNetworking dispatch_after错误:“ [AnyObject]?” 不是“无效”的子类型 - dispatch_after error: '[AnyObject]?' is not a subtype of 'Void' NSMutable Array无法覆盖[AnyObject] / NSMutableArray以强制强制键入SKAction - NSMutable Array not covertible to [AnyObject] / NSMutableArray to type SKAction in coercion Swift AnyObject 参数 - Swift AnyObject Parameters
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM