forked from swiftlang/swift
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathobjc_protocol_lookup.swift
80 lines (61 loc) · 1.18 KB
/
objc_protocol_lookup.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
// Check JIT mode
// RUN: %target-jit-run %s | %FileCheck %s
// REQUIRES: swift_interpreter
// REQUIRES: objc_interop
import Foundation
@objc protocol Fungible: Runcible {
func funge()
}
@objc protocol Runcible {
func runce()
}
class C: Fungible {
@objc func runce() {}
@objc func funge() {}
}
class D {}
extension D: Fungible {
@objc func runce() {}
@objc func funge() {}
}
extension NSString: Fungible {
func runce() {}
func funge() {}
}
func check(_ x: AnyObject) {
print("\(x is Fungible) \(x is Runcible)")
}
check(NSString()) // CHECK: true true
check(C()) // CHECK: true true
check(D()) // CHECK: true true
// Make sure partial application of methods with @autoreleased
// return values works
var count = 0
class Juice : NSObject {
override init() {
count += 1
}
deinit {
count -= 1
}
}
@objc protocol Fruit {
@objc optional var juice: Juice { get }
}
class Durian : NSObject, Fruit {
init(juice: Juice) {
self.juice = juice
}
var juice: Juice
}
func consume(_ fruit: Fruit) {
_ = fruit.juice
}
autoreleasepool {
let tasty = Durian(juice: Juice())
print(count) // CHECK: 1
consume(tasty)
}
do {
print(count) // CHECK: 0
}