Dear Susan,

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