> On Aug 25, 2017, at 3:54 PM, Logan Shire <logan.sh...@gmail.com> wrote:
> 
> How would you feel about wrapping the existing functions on 
> _KVOKeyPathBridgeMachinery:
> 
> @nonobjc fileprivate static func _bridgeKeyPath(_ keyPath:AnyKeyPath) -> 
> String
> @nonobjc fileprivate static func _bridgeKeyPath(_ keyPath:String?) -> 
> AnyKeyPath?
> 
> In extensions on String and AnyKeyPath respectively to instantiate strings 
> from KeyPaths and KeyPaths from Strings?

Those functions are designed for Cocoa interop only. They're not going to 
produce results that make sense for all Swift key paths.


-Joe

> https://github.com/apple/swift/blob/c5ff1f2cac8da6a14330f4b033b94c7c926d2126/stdlib/public/SDK/Foundation/NSObject.swift#L84
>  
> <https://github.com/apple/swift/blob/c5ff1f2cac8da6a14330f4b033b94c7c926d2126/stdlib/public/SDK/Foundation/NSObject.swift#L84>
> 
> On Fri, Aug 25, 2017 at 11:43 AM Joe Groff <jgr...@apple.com 
> <mailto:jgr...@apple.com>> wrote:
> 
> > On Aug 23, 2017, at 11:18 PM, Logan Shire via swift-evolution 
> > <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
> >
> > Hey folks!
> >
> > Recently I’ve been working on a small library which leverages the Swift 4 
> > Codable protocol
> > and KeyPaths to provide a Swift-y interface to CoreData. (It maps back and 
> > forth between
> > native, immutable Swift structs and NSManagedObjects). In doing so I found 
> > a couple of
> > frustrating limitations to the KeyPath API. Firstly, KeyPath does not 
> > provide the name of the
> > property on the type it indexes. For example, if I have a struct:
> >
> >
> > struct Person {
> >    let firstName: String
> >    let lastName: String
> > }
> >
> > let keyPath = \Person.firstName
> >
> >
> > But once I have a keyPath, I can’t actually figure out what property it 
> > accesses.
> > So, I wind up having to make a wrapper:
> >
> >
> > struct Attribute {
> >    let keyPath: AnyKeyPath
> >    let propertyName: String
> > }
> >
> > let firstNameAttribute = Attribute(keyPath: \Person.firstName, 
> > propertyName: “firstName”)
> >
> >
> > This forces me to write out the property name myself as a string which is 
> > very error prone.
> > All I want is to be able to access:
> >
> >
> > keyPath.propertyName // “firstName”
> >
> >
> > It would also be nice if we provided the full path as a string as well:
> >
> >
> > keyPath.fullPath // “Person.firstName"
> >
> >
> > Also, if I want to get all of the attributes from a given Swift type, my 
> > options are to try to hack
> > something together with Mirrors, or forcing the type to declare a function 
> > / computed property
> > returning an array of all of its key path / property name pairings. I would 
> > really like to be able to
> > retrieve a type-erased array of any type’s key paths with:
> >
> >
> > let person = Person(firstName: “John”, lastName: “Doe”)
> > let keyPaths = Person.keyPaths
> > let firstNameKeyPath = keyPaths.first { $0.propertyName = “firstName” } as! 
> > KeyPath<Person, String>
> > let firstName = person[keypath: firstNameKeyPath] // “John"
> >
> >
> > And finally, without straying too far into Objective-C land, it would be 
> > nice if we could initialize key paths
> > with a throwing initializer.
> >
> >
> > let keyPath = try Person.keyPath(“firstName”) // KeyPath<Person, String> 
> > type erased to AnyKeyPath
> > let keyPath = AnyKeyPath(“Person.firstName”)
> >
> >
> > Let me know what you think about any / all of these suggestions!
> 
> These would all be great additional features to eventually add to key paths. 
> I think reflection mechanisms centered on key paths like what you describe 
> would be a superior replacement for most of what Mirror attempts to provide.
> 
> -Joe

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to