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 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
|
// RUN: %target-typecheck-verify-swift -target %target-cpu-apple-macosx10.15 -solver-expression-time-threshold=1 -swift-version 5
// REQUIRES: OS=macosx
import Combine
enum Status {
case up
case down
}
protocol StatusMonitor {
var statusPublisher: AnyPublisher<Status, Never> { get }
}
protocol UIController {}
protocol ControllerProtocol {}
class TestViewController : UIController, ControllerProtocol {
}
class OtherController {
var innerController: (any UIController & ControllerProtocol)? = nil
}
class Test1 {
var monitor: StatusMonitor
var subscriptions: [AnyCancellable] = []
var status: Status? = nil
var statuses: [Status]? = nil
init(monitor: StatusMonitor) {
self.monitor = monitor
}
func simpleMapTest() {
monitor.statusPublisher
.map { $0 }
.assign(to: \.status, on: self) // Ok
.store(in: &subscriptions)
}
func transformationTest() {
monitor.statusPublisher
.map { _ in (0...1).map { _ in .up } }
.assign(to: \.statuses, on: self) // Ok
.store(in: &subscriptions)
}
}
class FilteringTest {
@Published var flag = false
func test(viewController: inout OtherController) {
_ = $flag.filter { !$0 }
.map { _ in TestViewController() }
.first()
.handleEvents(receiveOutput: { _ in
print("event")
})
.assign(to: \.innerController, on: viewController) // Ok
}
}
extension Sequence {
func sorted<T: Comparable>(by keyPath: KeyPath<Element, T>) -> [Element] {
[]
}
}
func testCollectionUpcastWithTupleLabelErasure() {
struct Item {}
enum Info : Int, Hashable {
case one = 1
}
func test(data: [Info: [Item]]) -> [(Info, [Item])] {
data.map { $0 }
.sorted(by: \.key.rawValue) // Ok
}
}
do {
struct URL {
var path: String
func appendingPathComponent(_: String) -> URL { fatalError() }
}
struct EntryPoint {
var directory: URL { fatalError() }
}
func test(entryPoint: EntryPoint, data: [[String]]) {
let _ = data.map { suffixes in
let elements = ["a", "b"]
.flatMap { dir in
let directory = entryPoint.directory.appendingPathComponent(dir)
return suffixes.map { suffix in
directory.appendingPathComponent("\(suffix)")
}
}
.map(\.path) // Ok
return elements.joined(separator: ",")
}
}
}
|