Skip to content

Commit 509891d

Browse files
authored
Merge pull request #2649 from spevans/pr_sr_12020
SR-12020: Cannot as-cast Substring to NSString on linux
2 parents 444844a + f89c728 commit 509891d

File tree

2 files changed

+60
-2
lines changed

2 files changed

+60
-2
lines changed

Sources/Foundation/String.swift

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
import CoreFoundation
1414

15-
extension String : _ObjectiveCBridgeable {
15+
extension String: _ObjectiveCBridgeable {
1616

1717
public typealias _ObjectType = NSString
1818
public func _bridgeToObjectiveC() -> _ObjectType {
@@ -75,3 +75,37 @@ extension String : _ObjectiveCBridgeable {
7575
}
7676
}
7777
}
78+
79+
80+
extension Substring: _ObjectiveCBridgeable {
81+
82+
public func _bridgeToObjectiveC() -> NSString {
83+
return NSString(String(self))
84+
}
85+
86+
public static func _forceBridgeFromObjectiveC(_ source: NSString, result: inout Substring?) {
87+
result = _unconditionallyBridgeFromObjectiveC(source)
88+
}
89+
90+
@discardableResult
91+
public static func _conditionallyBridgeFromObjectiveC(_ source: NSString, result: inout Substring?) -> Bool {
92+
var value: String?
93+
if String._conditionallyBridgeFromObjectiveC(source, result: &value) {
94+
result = Substring(value!)
95+
return true
96+
} else {
97+
return false
98+
}
99+
}
100+
101+
public static func _unconditionallyBridgeFromObjectiveC(_ source: NSString?) -> Substring {
102+
if let object = source {
103+
var value: Substring?
104+
_conditionallyBridgeFromObjectiveC(object, result: &value)
105+
return value!
106+
} else {
107+
return ""
108+
}
109+
}
110+
111+
}

Tests/Foundation/Tests/TestNSString.swift

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,29 @@ class TestNSString: LoopbackServerTest {
122122
XCTAssertEqual(cluster.length, 3)
123123
}
124124

125+
func test_bridging() {
126+
let nsstring = NSString("NSString")
127+
let anyNSstring = nsstring as Any
128+
129+
XCTAssertEqual(nsstring as String, "NSString")
130+
XCTAssertEqual(nsstring as Substring, "NSString")
131+
132+
XCTAssertEqual(anyNSstring as! String, "NSString")
133+
XCTAssertEqual(anyNSstring as! Substring, "NSString")
134+
135+
XCTAssertEqual(anyNSstring as? String, "NSString")
136+
XCTAssertEqual(anyNSstring as? Substring, "NSString")
137+
138+
let string = "String"
139+
let subString = string.dropFirst()
140+
XCTAssertEqual(string as NSString, NSString("String"))
141+
XCTAssertEqual(subString as NSString, NSString("tring"))
142+
143+
let abc = "abc" as Substring as NSString
144+
XCTAssertEqual(abc, NSString("abc"))
145+
}
146+
147+
125148
func test_integerValue() {
126149
let string1: NSString = "123"
127150
XCTAssertEqual(string1.integerValue, 123)
@@ -1610,7 +1633,8 @@ class TestNSString: LoopbackServerTest {
16101633
var tests = [
16111634
("test_initData", test_initData),
16121635
("test_boolValue", test_boolValue ),
1613-
("test_BridgeConstruction", test_BridgeConstruction ),
1636+
("test_BridgeConstruction", test_BridgeConstruction),
1637+
("test_bridging", test_bridging),
16141638
("test_integerValue", test_integerValue ),
16151639
("test_intValue", test_intValue ),
16161640
("test_doubleValue", test_doubleValue),

0 commit comments

Comments
 (0)