mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
This is a better solution to <rdar://problem/16899681> because the runtime magic is limited to implementing the witnesses of this conformance. The type checker fixes are because we can end up using unchecked optionals in more places, via bridging, than we could before. Swift SVN r18120
171 lines
4.6 KiB
Swift
171 lines
4.6 KiB
Swift
// RUN: %target-run-simple-swift | FileCheck %s
|
|
|
|
import Foundation
|
|
|
|
var activeXObjects: Int = 0
|
|
|
|
class X {
|
|
var value: Int
|
|
|
|
init(value: Int) {
|
|
self.value = value
|
|
|
|
++activeXObjects
|
|
}
|
|
|
|
deinit {
|
|
--activeXObjects
|
|
}
|
|
}
|
|
|
|
func getIUO<T>(x: T?) -> T! { return x }
|
|
|
|
// Bridge an array of an implicitly unwrapped class type.
|
|
func testConvertArrayOfImplicitUnwrappedClass() {
|
|
println("Converting array of IOU of class type to NSArray...")
|
|
let classArr1 = [ getIUO(X(value: 1)), getIUO(X(value: 2)) ]
|
|
let classNSArr1: NSArray = classArr1
|
|
// CHECK: Class array count = 2
|
|
println("Class array count = \(classNSArr1.count)")
|
|
|
|
// CHECK: Element 0 has value 1
|
|
// CHECK: Element 1 has value 2
|
|
for (index, obj) in enumerate(classNSArr1) {
|
|
if let x = obj as X {
|
|
println("Element \(index) has value \(x.value)")
|
|
} else {
|
|
println("Element \(index) is not an X")
|
|
}
|
|
}
|
|
}
|
|
|
|
testConvertArrayOfImplicitUnwrappedClass()
|
|
|
|
// CHECK: Active X objects = 0
|
|
println("Active X objects = \(activeXObjects)")
|
|
|
|
// Bridge an array of an implicitly unwrapped bridged value type.
|
|
func testConvertArrayOfImplicitUnwrappedValue() {
|
|
println("Converting array of IOU of String to NSArray...")
|
|
// FIXME: Array literal of these explodes
|
|
var stringArr1: (String!)[] = []
|
|
stringArr1.append(getIUO("Hello"))
|
|
stringArr1.append(getIUO("World"))
|
|
|
|
let stringNSArr1: NSArray = stringArr1
|
|
|
|
// CHECK: String array count = 2
|
|
println("String array count = \(stringNSArr1.count)")
|
|
|
|
// CHECK: Element 0 has value Hello
|
|
// CHECK: Element 1 has value World
|
|
for (index, obj) in enumerate(stringNSArr1) {
|
|
if let str = obj as String {
|
|
println("Element \(index) has value \(str)")
|
|
} else {
|
|
println("Element \(index) is not a String")
|
|
}
|
|
}
|
|
|
|
// FIXME: "stringNSArray1[0] as String" also fails
|
|
}
|
|
|
|
testConvertArrayOfImplicitUnwrappedValue()
|
|
|
|
// Bridge an array of an implicitly unwrapped array value type.
|
|
func testConvertArrayOfImplicitUnwrappedArray() {
|
|
println("Converting array of IOU of Arrays of String to NSArray...")
|
|
// FIXME: Array literal of these explodes
|
|
var stringArr1: (String!)[] = []
|
|
stringArr1.append(getIUO("Hello"))
|
|
stringArr1.append(getIUO("World"))
|
|
|
|
var stringArr2: (String!)[] = []
|
|
stringArr2.append(getIUO("Welcome"))
|
|
stringArr2.append(getIUO("Swift"))
|
|
|
|
var stringArrArr: (((String!)[])!)[] = []
|
|
stringArrArr.append(getIUO(stringArr1))
|
|
stringArrArr.append(getIUO(stringArr2))
|
|
|
|
let nsarr: NSArray = stringArrArr
|
|
|
|
// CHECK: String array array count = 2
|
|
println("String array array count = \(nsarr.count)")
|
|
|
|
// CHECK: Element 0 has value (
|
|
// CHECK: Hello,
|
|
// CHECK: World
|
|
// CHECK: )
|
|
// CHECK: Element 1 has value (
|
|
// CHECK: Welcome,
|
|
// CHECK: Swift
|
|
// CHECK: )
|
|
for (index, obj) in enumerate(nsarr) {
|
|
if let innerNSArr = obj as NSArray {
|
|
println("Element \(index) has value \(innerNSArr.description!)")
|
|
} else {
|
|
println("Element \(index) is not an NSArray")
|
|
}
|
|
|
|
// FIXME: Downcast to (String!)[]
|
|
}
|
|
}
|
|
|
|
testConvertArrayOfImplicitUnwrappedArray()
|
|
|
|
#if false
|
|
// Bridge an NSArray to an array of implicitly unwrapped class type.
|
|
func testConvertToArrayOfImplicitUnwrappedClass() {
|
|
println("Converting an NSArray to an array of X!")
|
|
var nsarr = NSMutableArray()
|
|
nsarr.addObject(X(value: 1))
|
|
nsarr.addObject(X(value: 2))
|
|
|
|
var arr: (X!)[] = _convertNSArrayToArray(nsarr)
|
|
|
|
// CHECK-DISABLED: Class array count = 2
|
|
// CHECK-DISABLED: Element 0 has value X(1)
|
|
// CHECK-DISABLED: Element 1 has value X(2)
|
|
println("Class array count = \(arr.count)")
|
|
for (index, opt) in enumerate(arr) {
|
|
if let x = opt {
|
|
println("Element \(index) has value X(\(x.value))")
|
|
} else {
|
|
println("Element \(index) is empty")
|
|
}
|
|
}
|
|
}
|
|
|
|
testConvertToArrayOfImplicitUnwrappedClass()
|
|
|
|
// Bridge an NSArray to an array of implicitly unwrapped string type.
|
|
func testConvertToArrayOfImplicitUnwrappedString() {
|
|
println("Converting an NSArray to an array of String!")
|
|
var nsarr = NSMutableArray()
|
|
nsarr.addObject(NSString(string: "Hello"))
|
|
nsarr.addObject(NSString(string: "World"))
|
|
|
|
var arr: (String!)[] = _convertNSArrayToArray(nsarr)
|
|
|
|
// CHECK-DISABLED: String array count = 2
|
|
// CHECK-DISABLED: Element 0 has value Hello
|
|
// CHECK-DISABLED: Element 1 has value World
|
|
println("String array count = \(arr.count)")
|
|
for (index, opt) in enumerate(arr) {
|
|
if let str = opt {
|
|
println("Element \(index) has value X(str)")
|
|
} else {
|
|
println("Element \(index) is empty")
|
|
}
|
|
}
|
|
}
|
|
|
|
testConvertToArrayOfImplicitUnwrappedString()
|
|
#endif
|
|
|
|
// FIXME: Negative tests will need their own path.
|
|
|
|
// CHECK: DONE
|
|
println("DONE")
|