此代码在Swift 3之前有效。(诅咒Swift 3!)
现在它针对<div id="map"></div>
<!-- Replace the value of the key parameter with your own API key. -->
<script async defer
src="https://maps.googleapis.com/maps/api/js?key=AIzaSyDwqIkJwBb6g4KirOaLnNgE1I6MtWnKxac&callback=initMap&language=ja">
</script>
行显示此错误:
无法将'NSMutableDictionary'类型的值转换为预期值 参数类型'[AnyHashable:Any]!'
将Flurry.logEvent(eventName, withParameters: userData!)
投射到userData!
会产生此错误:
无法将'NSMutableDictionary'类型的值转换为type '[AnyHashable:Any]'在胁迫中
[AnyHashable : Any]
Swift 3的正确语法是什么?
答案 0 :(得分:21)
如果Flurry.logEvent(_:withParameters:)
占用[AnyHashable: Any]
,为什么不将其用作本地userData
?
func logEvent(_ eventName: String, userData: NSMutableDictionary?) {
// Use <userData> or create new one?
var userData = userData as NSDictionary? as? [AnyHashable: Any] ?? [:]
// Set base properties
userData["Num Tofus"] = gUser.tofus.count
userData["Num Lifetime Tofus"] = gUser.getLifetimeTofus()
// Call Flurry
DispatchQueue.main.async {
Flurry.logEvent(eventName, withParameters: userData)
}
}
<强>更新强>
包含SE-0139和SE-0140的Xcode 8.1 GM种子已淘汰,因此下面的列表已更新。
这些是 Objective-C安全类型,设置为[AnyHashable: Any]
字典(或设置在[Any]
数组中,或者只是传递给Any
这是Objective-C中的非null id
,其中传递给Objective-C世界:
nil
nil
转换为NSNull
,所有非零选项都会被解包。
(NSNull
可能不是您想要的。仍然要小心检查零。)
Bool
Int8
,UInt8
,Int16
,UInt16
,Int32
,UInt32
,Int64
,UInt64
, 以及
Int
,UInt
,Double
,Float
,CGFloat
和Bool
。这些转换为NSNumber
。
String
转换为NSString
。
Array
,其中Element
是Objective-C safe 转换为NSArray
。
Dictionary
,其中Key
和Value
是Objective-C安全的转换为NSDictionary
。
Set
,其中Element
是Objective-C safe 转换为NSSet
NSObject
后代类型未转换,按原样使用。
请参阅列表here。
NSValue
具有 NSRange
,
CGPoint
,
CGVector
,
CGSize
,
CGRect
,
CGAffineTransform
,
UIEdgeInsets
,
UIOffset
,
CATransform3D
,
CMTime
,
CMTimeRange
,
CMTimeMapping
,
CLLocationCoordinate2D
,
MKCoordinateSpan
,
SCNVector3
,
SCNVector4
,
SCNMatrix4
。
这些类型将转换为NSValue
。 (NSRange
已在旧版Swifts中转换为NSValue
,但没有详细记录。)
即使在Swift 3.0.1中,仍有一些值可能会转换为_SwiftValue
。
(见this list。)
我没有检查所有包装器枚举和结构,但其中一些(例如,Notification.Name
到NSString
)似乎已安全转换。
Bool
Int
,UInt
,Double
,Float
,CGFloat
和Bool
。这些转换为NSNumber
。
String
转换为NSString
。
Array
,其中Element
是Objective-C safe 转换为NSArray
。
Dictionary
,其中Key
和Value
是Objective-C safe 转换为NSDictionary
。
Set
,其中Element
是Objective-C safe 转换为NSSet
NSObject
后代类型未转换,按原样使用。
请参阅列表here。 (链接的文章已针对Swift 3.0.1进行了更新。)
这些可能会转换为_SwiftValue
,这在Objective-C世界中是完全无用的和灾难性的。
Int8
,UInt8
,Int16
,UInt16
,Int32
,UInt32
,Int64
,UInt64
nil