Swift 3:无法将类型“NSMutableDictionary”的值转换为预期参数类型“[AnyHashable:Any]!”

2024-01-05

这段代码在 Swift 3 之前有效。(诅咒你的 Swift 3!)

现在它显示了这个错误Flurry.logEvent(eventName, withParameters: userData!) line:

无法将“NSMutableDictionary”类型的值转换为预期值 参数类型“[AnyHashable:Any]!”

Casting userData! to [AnyHashable : Any]产生这个错误:

无法将“NSMutableDictionary”类型的值转换为类型 强制转换中的“[AnyHashable : Any]”

func logEvent(_ eventName: String, userData: NSMutableDictionary?) {
    // Use <userData> or create new one?
    var userData = userData
    if userData == nil {
        userData = NSMutableDictionary()
    }

    // Set base properties
    userData!.setObject(gUser.tofus.count, forKey: "Num Tofus" as NSCopying)
    userData!.setObject(gUser.getLifetimeTofus(), forKey: "Num Lifetime Tofus" as NSCopying)

    // Call Flurry
    DispatchQueue.main.async {
        Flurry.logEvent(eventName, withParameters: userData! as [AnyHashable:Any])
    }
}

Swift 3 的正确语法是什么?


If that Flurry.logEvent(_:withParameters:) takes [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)
    }
}

UPDATE

Xcode 8.1 GM 种子包括SE-0139 https://github.com/apple/swift-evolution/blob/master/proposals/0139-bridge-nsnumber-and-nsvalue.md and SE-0140 https://github.com/apple/swift-evolution/blob/master/proposals/0140-bridge-optional-to-nsnull.md已发布,因此下面的列表已更新。

这些是Objective-C 安全类型,当设置为[AnyHashable: Any]字典(或设置在[Any]数组,或者简单地传递给Any这是一个非空值id在 Objective-C 中),其中传递到 Objective-C 世界:

斯威夫特 3.0.1/Xcode 8.1

  • 可选值包括nil

nil被转换为NSNull,所有非零选项都被展开。

(NSNull可能不是你想要的。仍然要小心 nil 检查。)

  • All数字类型和Bool

Int8, UInt8, Int16, UInt16, Int32, UInt32, Int64, UInt64, 也Int, UInt, Double, Float, CGFloat and Bool。这些被转换为NSNumber.

  • String

转换成NSString.

  • Array, where ElementObjective-C 是安全的

转换成NSArray.

  • Dictionary, where Key and ValueObjective-C 是安全的

转换成NSDictionary.

  • Set, where ElementObjective-C 是安全的

转换成NSSet

  • NSObject后代类型

未转换,按原样使用。

  • 具有对应引用类型的值类型

查看列表here https://developer.apple.com/library/prerelease/content/documentation/Swift/Conceptual/BuildingCocoaApps/WorkingWithCocoaDataTypes.html#//apple_ref/doc/uid/TP40014216-CH6-ID211.

  • 值类型,其中NSValue有一个初始化程序

NSRange, CGPoint, CGVector, CGSize, CGRect, CGAffineTransform, UIEdgeInsets, UIOffset, CATransform3D, CMTime, CMTimeRange, CMTimeMapping, CLLocationCoordinate2D, MKCoordinateSpan, SCNVector3, SCNVector4, SCNMatrix4。 这些类型被转换为NSValue. (NSRange已经可以转换为NSValue在较旧的 Swift 中,但没有详细记录。)

坏事(示例)

仍有一些值可以转换为_SwiftValue即使在 Swift 3.0.1 中也是如此。

  • 仅限 Swift 的类型,例如(仅限 Swift)enum、struct、tuple...

(See 这个清单 https://developer.apple.com/library/prerelease/content/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithObjective-CAPIs.html#//apple_ref/doc/uid/TP40014216-CH4-ID53.)

我没有检查所有包装器枚举和结构,但检查了其中一些(例如,Notification.Name to NSString)似乎已安全转换。


斯威夫特 3.0.0/Xcode 8.0

  • 非可选数字类型和Bool

Int, UInt, Double, Float, CGFloat and Bool。这些被转换为NSNumber.

  • 非可选String

转换成NSString.

  • 非可选Array, where ElementObjective-C 是安全的

转换成NSArray.

  • 非可选Dictionary, where Key and ValueObjective-C 是安全的

转换成NSDictionary.

  • 非可选Set, where ElementObjective-C 是安全的

转换成NSSet

  • 非可选NSObject后代类型

未转换,按原样使用。

  • 具有对应引用类型的非可选值类型

查看列表here https://developer.apple.com/library/prerelease/content/documentation/Swift/Conceptual/BuildingCocoaApps/WorkingWithCocoaDataTypes.html#//apple_ref/doc/uid/TP40014216-CH6-ID211。 (链接的文章已针对 Swift 3.0.1 进行更新。)

坏事(示例)

这些可以转换为_SwiftValue,这在 Objective-C 世界中是完全无用且灾难性的。

  • Int8, UInt8, Int16, UInt16, Int32, UInt32, Int64, UInt64
  • 任何可选值包括nil
  • 仅限 Swift 的类型,例如(仅限 Swift)enum、struct、tuple...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift 3:无法将类型“NSMutableDictionary”的值转换为预期参数类型“[AnyHashable:Any]!” 的相关文章

随机推荐

  • 如何读懂“交替”行?

    我有一个文本文件 其中包含遵循替代模式的行 例如 name SomeName counterA 0 counterB 0 counterC 0 name SomeNameB counterA 1 counterB 2 counterC 3
  • Android 中的 3D 轮播

    我正在为 Android 开发 3D Carousel 我正在用这个code http www codeproject com Articles 146145 Android 3D Carousel以下是我当前的输出 我想开发以下3D形状的
  • Word 打开 XML 邮件合并

    我正在尝试使用 Word 的 XML 来自 Word 2007 手动创建邮件合并 我有以下无效的 XML
  • 水晶报表“文件名无效。”问题

    我已经上传了我的 WebApplication 我的应用程序是在 VS2008 中使用 Crystal Reports 2008 sp3 我已经上传到并行丛服务器上 我已将水晶报表所需的所有 Dll 添加到 Bin 文件夹中 我的报告路径也
  • 错误:无法在服务器上启动调试

    我使用 Visual Studio 2010 mvc3 设计和开发了我的网站 我已从服务器复制了我的项目 编辑数据库服务器名称后 我尝试运行我的项目 但它显示错误 无法在服务器上启动调试 调试器无法连接到远程计算机 这可能是因为远程计算机未
  • Nativescript + iOS webview + 本地文件

    我目前正在开发一个简单的应用程序 该应用程序有一个使用网络视图的 HTML 部分 内容位于 app www 文件夹中 我从 home ts 组件访问它们 在 HTML 中使用类似的内容
  • Rails 4 HABTM 关联的自定义验证

    我有一个简单的场景 但我似乎找不到任何适用于 Rails 4 的建议解决方案 我只想添加一个自定义验证器来检查我的 HABTM 关联之间存储的关联数量 令我惊讶的是 说起来容易做起来容易吗 我已经寻找了一个解决方案 但最终似乎只找到了旧版本
  • 在 GitHub 的 Atom 编辑器中安装 Kite 插件

    我想试一试Kite https www kite com 这是人工智能的概念 帮助开发人员提供有关他或她当前正在编写的有用函数或表达式的提示 我已经下载了风筝原子插件 https github com kiteco plugins来自 Gi
  • php 使用 preg_match 验证字符串

    我试图在 PHP 中使用 preg match 验证输入字符串仅包含 a z A Z 0 9 字符 如果它只包含这些 则进行验证 我尝试在谷歌上搜索 但找不到任何有用的东西 有人可以帮忙吗 谢谢 使用模式 A Za z0 9 如果空字符串也
  • Ember.js ember-data resadapter 无法加载 json

    干杯 我有余烬数据存储 TravelClient Store DS Store extend revision 11 adapter DS RESTAdapter create bulkCommit false url http someI
  • 如何删除今天创建的所有记录?

    我正在处理一个非常大的数据库 600 万条记录 我今天添加了约 30 000 条不良记录 如何删除MySQL中今天创建的所有记录 它似乎created at是一个日期时间 尝试 delete from table where date cr
  • vs2015 更新 3 时 npm 安装失败并出现错误 C2373

    使用 Windows 10 重新安装我的机器后 进行设置Visual Studio 2015我在安装 git 存储库时遇到此错误 npm install在不同的项目上失败了 C Program Files nodejs node modul
  • Fortran 数组中的变量被删除?

    我有下面的代码 具有抽象类型 继承类型和一个短程序 我在其中创建一个对象并将其存储在数组中 module m implicit none type container class a allocatable item end type co
  • jQuery:禁用除当前复选框之外的所有复选框

    我有一些复选框需要以与单选按钮控件类似的方式运行 本质上 当选中一项时 所有其他项都需要取消选中 我怎样才能以尽可能少的痛苦来实现这一目标 所以总结一下 如果选中某个复选框 则必须取消选中所有其他 同级 保持单击的一个复选框不变 我已经知道
  • javascript postMessage 不工作

    我不知道该怎么办 我尝试了来自不同来源的几个示例代码 我在不同的浏览器中尝试了它们 从 Chrome 9 到 FF 4 但似乎仍然没有任何内容可以与 postMessage 功能一起使用 JS 控制台没有给我任何信息 没有一个错误 仍然没有
  • PowerShell 和 ActiveDirectory 模块 - 查找不属于特定组的用户

    上周 我第一次接触到 PowerShell 和 Active Directory 我希望能够找到非管理员与域管理员的用户列表 到目前为止 我知道如何使用以下命令 语句获取所有 ActiveDirectory 用户的所有属性 Get ADUs
  • 广义新类型推导

    Haskell 可以推导出以下实例MonadState s in T1低于但不在T2然而 这是一个非常相似的类型 我应该以什么方式修改代码T2这样的实例MonadState s可以自动导出吗 LANGUAGE GeneralizedNewt
  • Matlab 未绘制精确的傅里叶信号

    我正在尝试使用 Matlab 在傅立叶域中绘制一个简单的信号 它没有绘制正确的信号 这是我的代码 clc clear all close all x 1 0 001 10 f1 sin 2 pi 10 x f2 sin 2 pi 15 x
  • 使用 Properties.Default.Settings 时,应用程序会创建名称中带有“_”空格的文件夹

    所以情况就像 在程序集信息 对于 C Winform 应用程序 中 我这样输入 Now When I run it it creates folder with in name in place of Space Like this 它会在
  • Swift 3:无法将类型“NSMutableDictionary”的值转换为预期参数类型“[AnyHashable:Any]!”

    这段代码在 Swift 3 之前有效 诅咒你的 Swift 3 现在它显示了这个错误Flurry logEvent eventName withParameters userData line 无法将 NSMutableDictionary