无法将'[NSObject:AnyObject]'类型的值转换为预期的参数类型'[String:AnyObject]'

时间:2015-09-21 09:05:50

标签: swift xcode7

Xcode7和swift,我的代码:

func loadDefaults() {
    let settingBundle = NSBundle.mainBundle().pathForResource("Settings", ofType: "bundle")
    if settingBundle == nil {
        return
    }

    let root = NSDictionary(contentsOfFile: settingBundle!.stringByAppendingString("Root.plist"))

    let prefrences = root?.objectForKey("PreferenceSpecifiers") as! Array<NSDictionary>

    let defautlsToRegister = NSMutableDictionary(capacity: root!.count)

    for prefrence in prefrences {
        let key = prefrence.objectForKey("Key") as! String!
        if key != nil {
            defautlsToRegister.setValue(prefrence.objectForKey("DefaultVale"), forKey: key!)
        }
    }

    NSUserDefaults.standardUserDefaults().registerDefaults(defautlsToRegister as [NSObject: AnyObject])
}

问题代码:

NSUserDefaults.standardUserDefaults().registerDefaults(defautlsToRegister as [NSObject: AnyObject])

建立警告

  

无法将'[NSObject:AnyObject]'类型的值转换为预期的参数类型'[String:AnyObject]'

更改代码:

NSUserDefaults.standardUserDefaults().registerDefaults(defautlsToRegister as [String: AnyObject])

建立警告

  

'NSMutableDictionary'不能转换为'[String:AnyObject]'

请教我怎么做?感谢。

3 个答案:

答案 0 :(得分:5)

您的defautlsToRegister应采用以下格式[String: AnyObject]

示例:以下内容无需警告

let defautlsToRegister = ["Test":10]
NSUserDefaults.standardUserDefaults().registerDefaults(defautlsToRegister as [String: AnyObject])

答案 1 :(得分:2)

我注意到这个错误很简单。我不确定是否是这种情况,但是铸造String to NSString似乎可以解决我的问题。我找到了一个解释,AnyObject是一个类型别名,用于表示任何引用类型的实例,例如:NSString。但Stringstruct,因此它不能是AnyObject的引用类型。

我认为有两种方法:

首先:

let keyForMyKey: NSString = NSString(string: "mykey") let result = dict.objectForKey(keyForMyKey) as? NSMutableArray

第二

let result = dict.objectForKey(NSString(string: "myKey")) as? NSMUtableArray

此处有关此问题的更多信息:http://drewag.me/posts/swift-s-weird-handling-of-basic-value-types-and-anyobject

答案 2 :(得分:0)

对我而言,这是有效的。

let token = fields["X-AUTH-TOKEN"]! as? [[String : AnyObject]] //{
                // safe to use employees
                self.bindings.setObject(NSString(format: "%@", token!) as String, forKey: "X-AUTH-TOKEN")

格式(NSString方法)将在此方案中起作用。