mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
In-place initialization means the class has a symbol we can reference from the category, so there's nothing to do on the IRGen side. For JIT mode, we just need to realize the class metadata by calling an accessor instead of directly referencing the symbol though.
58 lines
930 B
Swift
58 lines
930 B
Swift
// RUN: %target-run-simple-swift %s | %FileCheck %s
|
|
// REQUIRES: executable_test
|
|
// REQUIRES: objc_interop
|
|
|
|
import Foundation
|
|
|
|
// Category on a nested class
|
|
class OuterClass {
|
|
class InnerClass: NSObject {}
|
|
}
|
|
|
|
extension OuterClass.InnerClass {
|
|
@objc static let propertyInExtension = "foo"
|
|
|
|
@objc func dynamicMethod() -> String {
|
|
return "bar"
|
|
}
|
|
}
|
|
|
|
let x = OuterClass.InnerClass()
|
|
|
|
// CHECK: foo
|
|
print(type(of: x).propertyInExtension)
|
|
|
|
// CHECK: bar
|
|
print(x.dynamicMethod())
|
|
|
|
// Category on a concrete subclass of a generic base class
|
|
class Base<T> {
|
|
let t: T
|
|
|
|
init(t: T) { self.t = t }
|
|
}
|
|
|
|
class Derived : Base<Int> {}
|
|
|
|
extension Derived {
|
|
@objc func otherMethod() -> Int {
|
|
return t
|
|
}
|
|
}
|
|
|
|
let y: AnyObject = Derived(t: 100)
|
|
|
|
// CHECK: 100
|
|
print(y.otherMethod())
|
|
|
|
extension NSObject {
|
|
@objc func sillyMethod() -> Int {
|
|
return 123
|
|
}
|
|
}
|
|
|
|
let z: AnyObject = NSObject()
|
|
|
|
// CHECK: 123
|
|
print(z.sillyMethod())
|