| //===----------------------------------------------------------------------===// |
| // |
| // This source file is part of the Swift.org open source project |
| // |
| // Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors |
| // Licensed under Apache License v2.0 with Runtime Library Exception |
| // |
| // See https://swift.org/LICENSE.txt for license information |
| // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors |
| // |
| //===----------------------------------------------------------------------===// |
| |
| @_exported import Foundation // Clang module |
| |
| //===----------------------------------------------------------------------===// |
| // New Strings |
| //===----------------------------------------------------------------------===// |
| |
| // |
| // Conversion from NSString to Swift's native representation |
| // |
| |
| extension String { |
| public init(_ cocoaString: NSString) { |
| self = String(_cocoaString: cocoaString) |
| } |
| } |
| |
| extension String : _ObjectiveCBridgeable { |
| @_semantics("convertToObjectiveC") |
| public func _bridgeToObjectiveC() -> NSString { |
| // This method should not do anything extra except calling into the |
| // implementation inside core. (These two entry points should be |
| // equivalent.) |
| return unsafeBitCast(_bridgeToObjectiveCImpl() as AnyObject, to: NSString.self) |
| } |
| |
| public static func _forceBridgeFromObjectiveC( |
| _ x: NSString, |
| result: inout String? |
| ) { |
| result = String(x) |
| } |
| |
| public static func _conditionallyBridgeFromObjectiveC( |
| _ x: NSString, |
| result: inout String? |
| ) -> Bool { |
| self._forceBridgeFromObjectiveC(x, result: &result) |
| return result != nil |
| } |
| |
| public static func _unconditionallyBridgeFromObjectiveC( |
| _ source: NSString? |
| ) -> String { |
| // `nil` has historically been used as a stand-in for an empty |
| // string; map it to an empty string. |
| if _slowPath(source == nil) { return String() } |
| return String(source!) |
| } |
| } |
| |
| extension Substring : _ObjectiveCBridgeable { |
| @_semantics("convertToObjectiveC") |
| public func _bridgeToObjectiveC() -> NSString { |
| return String(self)._bridgeToObjectiveC() |
| } |
| |
| public static func _forceBridgeFromObjectiveC( |
| _ x: NSString, |
| result: inout Substring? |
| ) { |
| let s = String(x) |
| result = Substring(_base: s, s.startIndex ..< s.endIndex) |
| } |
| |
| public static func _conditionallyBridgeFromObjectiveC( |
| _ x: NSString, |
| result: inout Substring? |
| ) -> Bool { |
| self._forceBridgeFromObjectiveC(x, result: &result) |
| return result != nil |
| } |
| |
| public static func _unconditionallyBridgeFromObjectiveC( |
| _ source: NSString? |
| ) -> Substring { |
| // `nil` has historically been used as a stand-in for an empty |
| // string; map it to an empty substring. |
| if _slowPath(source == nil) { return Substring() } |
| let s = String(source!) |
| return Substring(_base: s, s.startIndex ..< s.endIndex) |
| } |
| } |
| |
| extension String: CVarArg {} |