def ObjectiveCBridgeableImplementationForNSValue(Type): return """ extension {Type}: _ObjectiveCBridgeable {{ public func _bridgeToObjectiveC() -> NSValue {{ var myself = self return NSValue(bytes: &myself, objCType: _getObjCTypeEncoding({Type}.self)) }} public static func _forceBridgeFromObjectiveC(_ source: NSValue, result: inout {Type}?) {{ precondition(strcmp(source.objCType, _getObjCTypeEncoding({Type}.self)) == 0, "NSValue does not contain the right type to bridge to {Type}") result = {Type}() source.getValue(&result!) }} public static func _conditionallyBridgeFromObjectiveC(_ source: NSValue, result: inout {Type}?) -> Bool {{ if strcmp(source.objCType, _getObjCTypeEncoding({Type}.self)) != 0 {{ result = nil return false }} result = {Type}() source.getValue(&result!) return true }} public static func _unconditionallyBridgeFromObjectiveC(_ source: NSValue?) -> {Type} {{ let unwrappedSource = source! precondition(strcmp(unwrappedSource.objCType, _getObjCTypeEncoding({Type}.self)) == 0, "NSValue does not contain the right type to bridge to {Type}") var result = {Type}() unwrappedSource.getValue(&result) return result }} }} """.format(Type=Type) def ObjectiveCBridgeableImplementationForNSValueWithCategoryMethods( Type, initializer, getter, objCType="_getObjCTypeEncoding" ): return """ extension {Type}: _ObjectiveCBridgeable {{ public func _bridgeToObjectiveC() -> NSValue {{ return {initializer}(self) }} public static func _forceBridgeFromObjectiveC(_ source: NSValue, result: inout {Type}?) {{ precondition(strcmp(source.objCType, {objCType}({Type}.self)) == 0, "NSValue does not contain the right type to bridge to {Type}") result = {getter}(source) }} public static func _conditionallyBridgeFromObjectiveC(_ source: NSValue, result: inout {Type}?) -> Bool {{ if strcmp(source.objCType, {objCType}({Type}.self)) != 0 {{ result = nil return false }} result = {getter}(source) return true }} public static func _unconditionallyBridgeFromObjectiveC(_ source: NSValue?) -> {Type} {{ let unwrappedSource = source! precondition(strcmp(unwrappedSource.objCType, {objCType}({Type}.self)) == 0, "NSValue does not contain the right type to bridge to {Type}") return {getter}(unwrappedSource) }} }} """.format(Type=Type, initializer=initializer, getter=getter, objCType=objCType)