栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

是否可以将(U)Int8 / 16/32/64类型的Swifts自动数值桥接到Foundation(NSNumber)?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

是否可以将(U)Int8 / 16/32/64类型的Swifts自动数值桥接到Foundation(NSNumber)?

是(可能):通过遵守协议
_ObjectiveCBridgeable

(以下答案基于使用 Swift 2.2 和XCode 7.3的情况。)

正如我在考虑是发布还是跳过该问题时,我偶然发现了

swift/stdlib/public/core/BridgeObjectiveC.swift
Swift源代码,尤其是协议
_ObjectiveCBridgeable
。我之前在Swiftdoc.org上已经简短地注意到了该协议,但是在后者的当前(空)蓝图形式中,我从没有对此进行过多考虑。
_ObjectiveCBridgeable
但是,使用来自Swift来源的蓝图,我们可以迅速让一些自定义类型的本机遵循它。

在继续之前,请注意这

_ObjectiveCBridgeable
是一个内部/隐藏协议(
_UnderScorePreFixedProtocol
),因此在即将发布的Swift版本中,基于该协议的解决方案可能会在没有警告的情况下中断。


启用

Int64
桥接至基金会类
NSNumber

作为一个示例,扩展

Int64
以符合
_ObjectiveCBridgeable
,然后测试此非常简单的修复程序是否足以将隐式类型转换(桥接)从
Int64
Foundation类
NSNumber
保留。

import Foundationextension Int64: _ObjectiveCBridgeable {    public typealias _ObjectiveCType = NSNumber    public static func _isBridgedToObjectiveC() -> Bool {        return true    }    public static func _getObjectiveCType() -> Any.Type {        return _ObjectiveCType.self    }    public func _bridgeToObjectiveC() -> _ObjectiveCType {        return NSNumber(longLong: self)    }    public static func _forceBridgeFromObjectiveC(source: _ObjectiveCType, inout result: Int64?) {        result = source.longLongValue    }    public static func _conditionallyBridgeFromObjectiveC(source: _ObjectiveCType, inout result: Int64?) -> Bool {        self._forceBridgeFromObjectiveC(source, result: &result)        return true    }}

测试:

let fooInt: Int = 42let fooInt64: Int64 = 42var fooAnyObj : AnyObjectfooAnyObj = fooInt    // OK, nativelyfooAnyObj = fooInt64  // OK! _ObjectiveCBridgeable conformance successfullet fooIntArr: [Int] = [42, 23]let fooInt64Arr: [Int64] = [42, 23]var fooAnyObjArr : [AnyObject]fooAnyObjArr = fooIntArr    // OK, nativelyfooAnyObjArr = fooInt64Arr  // OK! _ObjectiveCBridgeable conformance successful

因此,符合

_ObjectiveCBridgeable
确实足以使自动预分配桥接到相应的Foundation类。在这种情况下
NSNumber
(在Swift中
__NSCFNumber
)。


启用

Int8
UInt8
Int16
UInt16
Int32
UInt32
,(
Int64
)和
UInt64
桥接
NSNumber

使用下面的转换表

Int64
_ObjectiveCBridgeable
可以轻松地修改to
的上述一致性,以涵盖任何Swiftn本地整数类型
NSNumber



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/372273.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号