是(可能):通过遵守协议 _ObjectiveCBridgeable
(以下答案基于使用 Swift 2.2 和XCode 7.3的情况。)
正如我在考虑是发布还是跳过该问题时,我偶然发现了
swift/stdlib/public/core/BridgeObjectiveC.swiftSwift源代码,尤其是协议
_ObjectiveCBridgeable。我之前在Swiftdoc.org上已经简短地注意到了该协议,但是在后者的当前(空)蓝图形式中,我从没有对此进行过多考虑。
_ObjectiveCBridgeable但是,使用来自Swift来源的蓝图,我们可以迅速让一些自定义类型的本机遵循它。
在继续之前,请注意这
_ObjectiveCBridgeable是一个内部/隐藏协议(
_UnderScorePreFixedProtocol),因此在即将发布的Swift版本中,基于该协议的解决方案可能会在没有警告的情况下中断。
启用Int64
桥接至基金会类NSNumber
作为一个示例,扩展
Int64以符合
_ObjectiveCBridgeable,然后测试此非常简单的修复程序是否足以将隐式类型转换(桥接)从
Int64Foundation类
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。



