Would it let me get a property if it does not correspond to a property, or 
computed property? 

For example, would I be able to get the value returned by a fullName() instance 
method that concatenates the firstName and lastName properties together and 
returns the result? Or would it only work if fullName were implemented as a 
computed property as opposed to an instance method? 

Thanks



> On May 27, 2016, at 2:59 PM, Austin Zheng <[email protected]> wrote:
> 
> Yes, it was pretty much meant as a KVC-like feature for Swift. Get a 
> reference to a property from a string which would allow you to get and set 
> its value.
> 
>> On Fri, May 27, 2016 at 11:53 AM, Ricardo Parada <[email protected]> wrote:
>> 
>>> On May 26, 2016, at 9:25 PM, Austin Zheng via swift-evolution 
>>> <[email protected]> wrote:
>>> 
>>> ```
>>> myPerson.typedReadWriteProperty<Int>("age")?.set(30)
>>> 
>>> try myPerson.allNamedProperties["age"]?.set(30)
>>> ```
>> 
>> Can you elaborate on what this API would be used for?  KVC? For instance, I 
>> played with Mirror the other day and my code to get a value given the 
>> property name looked more like this:
>> 
>> let age = myPerson.value(forKey:”age”) as! Int
>> 
>> And this is what I did:
>> 
>> // KVC stands for key-value-coding… but I only know how to get values.  I 
>> don’t know how to set values
>> 
>> protocol KVC {
>>    func value(forKey key: String) -> Any!
>> }
>> 
>> // Default implementation
>> extension KVC {
>>    func value(forKey key: String) -> Any! {
>>        let aMirror = Mirror(reflecting:self)
>>        for case let (label?, value) in aMirror.children {
>>            if label == key {
>>                return value
>>            }
>>        }
>>        return nil
>>    }
>> }
>> 
>> public struct Person : KVC {
>>    let firstName: String
>>    let lastName: String
>>    let age: Int
>> 
>>    func fullName() -> String {
>>        return "\(firstName) \(lastName)"
>>    }
>> }
>> 
>> let aPerson = Person(firstName:"John", lastName:"Doe", age:48)
>> 
>> // It works for stored properties
>> let lastName = aPerson.value(forKey:"lastName") as! String
>> print("Last name is \(lastName)")
>> 
>> // It does not work for instance methods, i.e. fullName is not a stored 
>> property
>> let fullName = aPerson.value(forKey:"fullName")
>> if fullName != nil {
>>    print("Full name is \(fullName)")
>> } else {
>>    print("Unable to get fullName via KVC")
>> }
> 
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to