> On Dec 16, 2016, at 12:36 AM, Kevin Ballard <ke...@sb.org> wrote:
> 
> On Thu, Dec 15, 2016, at 03:01 PM, Charles Srstka wrote:
>>> On Dec 15, 2016, at 4:33 PM, Kevin Ballard <ke...@sb.org 
>>> <mailto:ke...@sb.org>> wrote:
>>> 
>>> The problem with that code isn't that `dynamic` doesn't work for computed 
>>> properties. It does; if you mutate the `foo` property, you'll get the KVO 
>>> notifications. The problem is you have one property that depends on another 
>>> and you didn't set up the KVO machinery properly using 
>>> automaticallyNotifiesObservers(forKey:) or 
>>> automaticallyNotifiesObserversOf<key>() (incidentally in Swift you can 
>>> write the latter as a `static let`, since that becomes a class method in 
>>> Obj-C).
>> 
>> You’ll only get the notifications if you mutate ‘foo’ directly. This, 
>> however, is fairly useless, because if you are watching ‘foo’, you want to 
>> be notified every time the value changes, not just when someone hits one 
>> particular accessor. Code relying on observation of ‘foo’ in the example I 
>> provided would be prone to breaking in mysterious and possibly horrible ways.
> 
> No, if you implement keyPathsForValuesAffecting<key>() then you get "foo" KVO 
> notifications when "bar" is mutated.  That's the whole point of that method, 
> and this is exactly what you have to do in Obj-C as well.

Right… the sentence I was quoting was talking about code which uses ‘dynamic’ 
but *doesn’t* use keyPathsForValuesAffecting<key>. You’ll get notifications if 
someone calls that one particular accessor, but otherwise you won’t.

>>> So yes, `dynamic` by itself doesn't mean that the property supports KVO. 
>>> But there are very few reasons to use `dynamic` outside of supporting KVO, 
>>> so it's a pretty good signal that the property does support it. And 
>>> conversely, not having `dynamic` doesn't mean that it doesn't support KVO, 
>>> though if it does have manual KVO support using 
>>> will/didChangeValue(forKey:) then it should be documented as such.
>> Use of the ‘dynamic’ keyword enables all manner of runtime hackery which 
>> someone may be employing. The trick to automatically add KVO conformance to 
>> accessors is probably the most common, but it’s hardly the only one. One 
>> also might want to declare things ‘dynamic’ when working with Objective-C 
>> frameworks not under one’s control which might assume the ability to do 
>> metaprogramming on your classes
> 
> That is exceedingly rare. I can't even remember the last time I used such a 
> thing.

You used such a thing the last time you used KVO. ;-)

>> I know it’s commonplace to use ‘dynamic’ all over the place wherever Core 
>> Data is involved.
> 
> It is? Why? Maybe you're confusing this with Obj-C's @dynamic keyword, which 
> is completely unrelated to Swift's `dynamic`. When writing Swift 
> NSManagedObject subclasses, you use the @NSManaged property attribute, not 
> the `dynamic` keyword (@NSManaged does effectively the same thing that 
> Obj-C's @dynamic, except it's reserved for integration with CoreData instead 
> of being as generic as Obj-C's @dynamic is).

@NSManaged implies dynamic, though. Core Data is entirely built on the dynamic 
runtime, and is using it pretty much everywhere.

>> Long story short, ‘dynamic’ does not guarantee KVO conformance in any way, 
>> shape, or form.
> 
> And declaring that your property returns a String doesn't guarantee that it 
> actually does either. You can always write broken code. But `dynamic` is 
> required for automatic KVO conformance, and it's extremely rare to have a 
> reason to use `dynamic` outside of KVO, so it's a really really strong signal 
> that the property supports KVO. If you're using `dynamic` on a property but 
> don't support KVO correctly, as you showed in your code example, that's a bug 
> with your code.

Correlation does not imply causation. Dynamic properties often support KVO, but 
the developer may have just declared it dynamic in order to use Objective-C’s 
dynamism to solve some other problem. You don’t know, and thus I certainly 
wouldn’t call it a bug in the code.

Charles

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

Reply via email to