File: swift-keypath-objc-optional-component.swift

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (58 lines) | stat: -rw-r--r-- 1,944 bytes parent folder | download
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
// RUN: %target-typecheck-verify-swift -disable-objc-attr-requires-foundation-module -import-objc-header %swift_src_root/test/Inputs/ObjCOptionalRequirements.h

// REQUIRES: objc_interop

@objc class Object {
  var name: String

  init(name: String) {
    self.name = name
  }
}

@objc protocol SwiftProtocol {
  @objc optional var object: Object { get set }

  @objc optional subscript(_: Bool) -> Object { get set }
}

func assertExactType<T>(of _: T, is _: T.Type) {}

// An optional storage component makes the key path read-only...
do {
  let kp_property = \SwiftProtocol.object
  let kp_subscript = \SwiftProtocol.[false]

  var p: SwiftProtocol
  // expected-error@+1 {{cannot assign through subscript: 'kp_property' is a read-only key path}}
  p[keyPath: kp_property] = Object(name: "nope")
  // expected-error@+1 {{cannot assign through subscript: 'kp_subscript' is a read-only key path}}
  p[keyPath: kp_subscript] = Object(name: "nope")

  assertExactType(of: kp_property, is: KeyPath<SwiftProtocol, Object?>.self)
  assertExactType(of: kp_subscript, is: KeyPath<SwiftProtocol, Object?>.self)
}
do {
  let kp_property_objc = \ObjCProtocol.flag

  var p: ObjCProtocol
  // expected-error@+1 {{cannot assign through subscript: 'kp_property_objc' is a read-only key path}}
  p[keyPath: kp_property_objc] = false

  assertExactType(of: kp_property_objc, is: KeyPath<ObjCProtocol, Bool?>.self)
}

// ...unless a reference-writable component shows up later.
do {
  let kp_propertyForce_name = \SwiftProtocol.object!.name
  let kp_subscriptForce_name = \SwiftProtocol.[true]!.name

  let p: SwiftProtocol
  p[keyPath: kp_propertyForce_name] = "yes"
  p[keyPath: kp_subscriptForce_name] = "yes"

  assertExactType(of: kp_propertyForce_name,
                  is: ReferenceWritableKeyPath<SwiftProtocol, String>.self)
  assertExactType(of: kp_subscriptForce_name,
                  is: ReferenceWritableKeyPath<SwiftProtocol, String>.self)
}