2016-09-23 13 views
0

我正在将应用程序转换为swift3并遇到以下问题。[NSObject:AnyObject]类型的字典没有成员“value(forKeyPath:...)”

@objc required init(response: HTTPURLResponse, representation: [NSObject : AnyObject]) 
{ 
    if (representation.value(forKeyPath: "title") is String) { 
     self.title = **representation.value**(forKeyPath: "title") as! String 
    } 

我收到以下错误:

Value of type [NSObject:AnyObject] has no member value.

在旧版本我只是用AnyObject类型为代表的代码,但如果我这样做,我得到的错误AnyObject is not a subtype of NSObject有:

if (representation.value(forKeyPath: "foo") is String) { 
    let elementObj = Element(response: response, representation:**representation.value(forKeyPath: "foo")**!) 
} 
+0

'NSObject'和'(forKeyPath:“title”)'不会很好。是否可以使用'[String:AnyObject]'? –

+0

为什么不简单'self.title = representation [“title”]'? – vikingosegundo

+0

你真的知道'value(forKeyPath:'应该做什么的方法吗? – vadian

回答

0

你在混合使用Objective-C和Swift样式。更好地实际决定。

桥接回NSDictionary不是自动的。

考虑:

let y: [NSObject: AnyObject] = ["foo" as NSString: 3 as AnyObject] // this is awkward, mixing Swift Dictionary with explicit types yet using an Obj-C type inside 
let z: NSDictionary = ["foo": 3] 
(y as NSDictionary).value(forKeyPath: "foo") // 3 
// y["foo"] // error, y's keys are explicitly typed as NSObject; reverse bridging String -> NSObject/NSString is not automatic 
y["foo" as NSString] // 3 
y["foo" as NSString] is Int // true 
z["foo"] // Bridging here is automatic though because NSDictionary is untyped leaving compiler freedom to adapt your values 
z["foo"] is Int // true 
// y.value // error, not defined 

// Easiest of all: 
let ynot = ["foo": 3] 
ynot["foo"] // Introductory swift, no casting needed 
ynot["foo"] is Int // Error, type is known at compile time 

参考:

https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/WorkingWithCocoaDataTypes.html

注意明确使用'as'得到String回到NSString需要。桥接不会隐藏,因为他们希望您使用参考类型(NSString)上的值类型(String)。所以这是故意更麻烦的。

One of the primary advantages of value types over reference types is that they make it easier to reason about your code. For more information about value types, see Classes and Structures in The Swift Programming Language (Swift 3), and WWDC 2015 session 414 Building Better Apps with Value Types in Swift.

相关问题