[swift-evolution] Swift's 'observe()' doesn't work for key paths with optionals?

Brent Royal-Gordon brent at architechies.com
Sat Jul 22 02:41:39 CDT 2017

> On Jul 22, 2017, at 12:12 AM, William Shipley via swift-evolution <swift-evolution at swift.org> wrote:
>         submodelObservation = observe(\.controller.submodel) { object, change in
>     // code
>         }
>     @objc dynamic internal var controller: Controller?
> in the the “Controller" class:
>     @objc dynamic internal var submodel: SubmodelForImporting?

I believe you're meant to actually construct a key path which looks through an `Optional` like this:


But if you try that, you'll get a different, temporary error:

	error: key path support for optional chaining components is not implemented

My understanding is that optional chaining in key paths *is* planned for Swift 4; it just hasn't landed yet. If making `controller` an implicitly-unwrapped optional would be a suitable workaround for you, I see that a couple pull requests to support IUOs were merged to swift-4.0-branch recently[1]; they might be in the open-source Swift 4 snapshot[2]. If not, my best suggestion would be to temporarily add a computed `controller_submodel` property and use the traditional `keyPathsForValuesAffecting…` mechanism to tie it to the underlying properties.

	[1] https://github.com/apple/swift/pull/11005
	[2] https://swift.org/download/#snapshots

Brent Royal-Gordon

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20170722/b278afbf/attachment.html>

More information about the swift-evolution mailing list