> We took this feedback seriously, and I would like to share with you the start 
> of an important journey for some of the most commonly used APIs on all of our 
> platforms: adopting value semantics for key Foundation types.

This proposal is way cool, and I think you've selected a great starting set of 
APIs.

Of the other candidate APIs you mentioned, I'm definitely looking forward to 
AttributedString and some parts of the NSURL Loading system (primarily the 
requests and responses; the connections and sessions should probably be object 
types). Predicate, OrderedSet, CountedSet, and possibly Number and Value make 
sense as well.

However, I think that Locale, Progress, Operation, Calendar, and Port are poor 
candidates for becoming value types, because they represent specific resources 
which may be partially outside of your thread's/process's control; that is, 
they're rather like NS/UIView, in that they represent a specific, identifiable 
"thing" which cannot be copied without losing some aspect of its meaning. (I 
also see little value in an Error type; honestly, in the long run I'd like to 
see Swift-facing Foundation grow towards pretending that NSError doesn't exist 
and only ErrorProtocol does.)

> The following code is a more natural match for the way Swift developers would 
> expect this to work:
> 
>       var myDate = Date()
>       myDate.addTimeInterval(60) // OK
>       
>       let myOtherDate = Date()
>       myOtherDate.addTimeInterval(60) // Error, as expected

The semantic is definitely more what Swift users expect, but the name may not 
be. As far as I can tell, this method should be called `add`, with 
`TimeInterval` elided under the "omit needless words" rule of Swift API 
translation. (Or just call it `+=`, of course...)

> URL           NSURL
> URLComponents NSURLComponents


Have you considered unifying these? NSURL has no mutable counterpart, but 
NSURLComponents sort of informally plays that role. As it is, it seems like URL 
would not really be able to support mutation very well—the operations would all 
be nonmutating under the hood.

> Using Swift structures for our smallest types can be as effective as using 
> tagged pointers in Objective-C.


Have you looked at the performance and size of your value type designs when 
they're made Optional? In the general case, Optional works by adding a tag byte 
after the wrapped instance, but for reference types it uses the 0x0 address 
instead. Thus, depending on how they're designed and where Swift is clever 
enough to find memory savings, these value types might end up taking more 
memory than the corresponding reference types when made Optional, particularly 
if the reference types have tagged pointer representations.

>     if !isUniquelyReferencedNonObjC(&_box) {


Something I have often wondered about: Why doesn't `isUniquelyReferenced(_:)` 
use `-retainCount` on Objective-C objects? Alternatively, why not use 
`-retainCount` on fields in your value types when you're trying to implement 
COW behavior? It seems like that would allow you to extend the copy-on-write 
mechanism to Objective-C objects. I know that `-retainCount` is usually not 
very useful, but surely this copy-on-write situation, where you are using it in 
an advisory fashion and an overestimated retain count will simply cause you to 
unnecessarily lose some efficiency, is the exception to the rule?

There are likely good reasons for this decision—they simply aren't obvious, and 
I'd like to understand them.

-- 
Brent Royal-Gordon
Architechies

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

Reply via email to