In order to prevent false-negatives for reference types, I would like to add a 
5th. point to my proposals:

5. Identity (i.e. `===`) should be checked even for reference types upfront and 
only if it returns `false` the custom `==` function of the developer is 
executed. This way you cannot implement an equals operator, that says two 
objects are **not** equal although they are the very same instance.


> Am 16.07.2016 um 13:50 schrieb Johannes Neubauer via swift-evolution 
> <[email protected]>:
> 
> I wrote the former mail in a hurry: the URI example from before is a 
> *false-positive* either and can be handled like the `Polar` example. But the 
> problem with false-negatives are still valid. Example:
> 
> ```swift
> func ==(lhs: A, rhs: B) {
>  if(globalBooleanVarIsDayEven) {
>    return false
>  }
>  // do a normal check
> }
> ```
> 
> This would not be possible, if you check for equality upfront and omitting 
> executing the custom code above if the standard check returns `true` already.
> 
> Another **big** problem with using `==` for properties to reference types 
> implementing `Equatable` is race conditions and as Matt Wright pointed out in 
> his talk [Concurrent Programming with GCD in Swift 3][0] on WWDC 2016, there 
> are no harmless cases of concurrency issues. Rationale:
> 
> Reference types share state possible with code that runs concurrently in 
> different threads. So if you compare via `==` to value types and use `==` to 
> compare the object(s) of a reference type property this object(s) may change 
> during the check (even if the machine has only one core, if the OS is 
> preemptive). And this may happen even if it is the very same (by identity and 
> `===`) object that is referenced. A (future) automatic value pool for 
> indirect storage with copy-on-write for value semantics would not share this 
> problem, of course, since their storage is only shared for reads and not for 
> writes (the `===` check on this indirect storage would by definition suffice 
> and be much faster than executing the check). This does not hold for 
> properties of references types in that indirect storage.
> 
> [0]: 
> http://devstreaming.apple.com/videos/wwdc/2016/720w6g8t9zhd23va0ai/720/720_concurrent_programming_with_gcd_in_swift_3.pdf

_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to