【问题标题】:Dictionary not being cast while calling Swift function from Objective C从 Objective C 调用 Swift 函数时没有转换字典
【发布时间】:2016-08-25 18:34:53
【问题描述】:

我正在使用桥接从目标 c 调用 swift 函数。还通过键值对传递 NSMutableDictionary。一个值(op_status)虽然在调用方完好无损,但在收到时变为空。附上代码:

NSMutableDictionary *offlineRequestData = [NSMutableDictionary dictionaryWithObjectsAndKeys:
soId, @"soId",
AddNoteScreen, @"screen",
NotesOperation, @"operation",
jsonBlob, @"jsonBlob",
createdDate, @"created_datetime",
[NSNumber numberWithInt:OperationNotSynced], @"op_status",
@"", @"sync_datetime", nil];

// OperationNotSynced 是一个枚举。

--

// 在 Swift 方面: // 使用字典的 Swift 函数内部

newRecord.op_status = valuesDictionary["op_status"] as? NSNumber

op_status 在此处为空。

此外,打印出 valuesDictionary["op_status"] 给了我 optional(int value) 和 unwrapping 打印值。但它不会被强制转换为 NSNumber。

感谢任何帮助。

【问题讨论】:

    标签: objective-c swift dictionary nsnumber


    【解决方案1】:

    由于op_statusInt?,您可以有条件地将其转换为Int 并使用初始化程序创建NSNumber

    if let opStatusInt = valuesDictionary["op_status"] as? Int {
        newRecord.op_status = NSNumber(value: opStatusInt)
    }
    

    【讨论】:

    • op_status 应该是 NSNumber?而不是 Int?对 ?当我这样做的时候?:[NSNumber numberWithInt:OperationNotSynced]。
    • Swift 会自动为您将其转换为 Int。 Swift 希望您使用其较新的 Foundation 类型,而不是像 NSNumber 这样过时的 Objective-C 类型。不幸的是,像 CoreData 这样的东西仍然依赖于NSNumber。有时您必须使用 Swift 编译器/类型系统来玩这些游戏。
    • 试过了,好像 valuesDictionary["op_status"] 没有被转换为 Int?还。打印出来会显示 Optional(1) (或其他值)。
    • 如果你打印出valuesDictionary["op_status"].dynamicType,它会说什么?
    • 可选
    猜你喜欢
    • 2015-05-07
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 2014-07-27
    • 2020-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多