IIUC, Jay wasn't arguing for renaming CharacterSet, but replacing it with 
Swift's existing Set mechanism. If/when generics get to the point that we can 
say 'extension Set<Character> {...}', I think the transition could simply be 
putting 'typealias CharacterSet = Set<Character>' somewhere in the framework 
(although I don't know how Obj-C interop would be affected by such a change).

- Dave Sweeris

> On Sep 29, 2016, at 00:30, Xiaodi Wu via swift-evolution 
> <[email protected]> wrote:
> 
> CharacterSet is a Foundation value type. It was a subject of the following 
> proposal:
> 
> https://github.com/apple/swift-evolution/blob/master/proposals/0069-swift-mutability-for-foundation.md
> 
> We might be able improve on the implementation, but I don't think re-arguing 
> the name is an option.
> 
> 
>> On Wed, Sep 28, 2016 at 11:59 PM Jay Abbott <[email protected]> wrote:
>> 
>> Yes - this is totally confusing. CharacterSet and Set<Character> are 
>> completely different things with different semantics.
>> 
>> I don't know the history, but is CharacterSet simply to have a Swift 
>> equivalent of NSCharacterSet? That seems to be what it is, but since Swift 
>> redefined characters in a better way, this should be removed or called 
>> something else to avoid confusion. You shouldn't have to qualify what you 
>> mean by 'character' in a type name because it diverges from the definition 
>> in the rest of the language.
>> 
>>> On Thu, 29 Sep 2016 at 04:48 Xiaodi Wu via swift-evolution 
>>> <[email protected]> wrote:
>>>> On Wed, Sep 28, 2016 at 10:34 PM, Xiaodi Wu <[email protected]> wrote:
>>> 
>>>> On Wed, Sep 28, 2016 at 10:23 PM, Charles Srstka via swift-evolution 
>>>> <[email protected]> wrote:
>>>>>> On Sep 28, 2016, at 9:57 PM, Erica Sadun via swift-evolution 
>>>>>> <[email protected]> wrote:
>>>>>> 
>>>>>> D'erp. I missed that. And that's an unambiguous answer.
>>>>>> 
>>>>>> So let me move on to part B of the pitch: I think CharacterSets are 
>>>>>> broken.
>>>>>> 
>>>>>>> Xiaodi Wu: "isn't the problem you're presenting really an argument that 
>>>>>>> the type should be fleshed out to handle characters (grapheme clusters) 
>>>>>>> containing more than one Unicode scalar?"
>>>>> 
>>>>> It seems that it already does handle such characters:
>>>>> 
>>>>> (done in Objective-C so we can log the length of the range as a count of 
>>>>> UTF-16 code units)
>>>>> 
>>>>> #import <Foundation/Foundation.h>
>>>>> 
>>>>> int main(int argc, char *argv[]) {
>>>>>     @autoreleasepool {
>>>>>         NSCharacterSet *bikeSet = [NSCharacterSet 
>>>>> characterSetWithCharactersInString:@"🚲"];
>>>>>         NSString *str = @"foo🚲bar";
>>>>>         
>>>>>         NSRange range = [str rangeOfCharacterFromSet:bikeSet];
>>>>>         
>>>>>         NSLog(@"location: %lu length: %lu", range.location, range.length);
>>>>>     }
>>>>> }
>>>>> 
>>>>> - - - - - - -
>>>>> 
>>>>> 2016-09-28 22:20:00.622471 test[15577:2433912] location: 3 length: 2
>>>>> Program ended with exit code: 0
>>>>> 
>>>>> - - - - - - -
>>>>> 
>>>>> As we can see, the character from the set is recognized as consisting of 
>>>>> two code units. There are a few bugs in the system, though. See the 
>>>>> cocoa-dev thread “Where is my bicycle?” from about a year ago: 
>>>>> http://prod.lists.apple.com/archives/cocoa-dev/2015/Apr/msg00074.html
>>>> 
>>>> The bike emoji might be two code units, but it is one Unicode scalar 
>>>> (U+1F6B2). However, the Canadian flag emoji, for instance, is two Unicode 
>>>> scalars (U+1F1E8 U+1F1E6) but nonetheless one character.
>>> 
>>> To illustrate in code how CharacterSet doesn't actually handle characters 
>>> made up of multiple Unicode scalars:
>>> 
>>> ```
>>> import Foundation
>>> 
>>> let str1 = "🇦🇩"
>>> let first = CharacterSet(charactersIn: str1) // this actually crashes 
>>> corelibs-foundation
>>> let str2 = "🇦🇺"
>>> let second = CharacterSet(charactersIn: str2)
>>> let intersection = first.intersection(second)
>>> print(intersection.isEmpty)
>>> // actual output: false
>>> // obviously, if we were really dealing with characters, the intersection 
>>> should be empty
>>> ```
>>> 
>>>> 
>>>>> Charles
>>>>> 
>>>>> 
>>>>> _______________________________________________
>>>>> swift-evolution mailing list
>>>>> [email protected]
>>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>>>> 
>>>> 
>>> _______________________________________________
>>> swift-evolution mailing list
>>> [email protected]
>>> https://lists.swift.org/mailman/listinfo/swift-evolution
> _______________________________________________
> swift-evolution mailing list
> [email protected]
> https://lists.swift.org/mailman/listinfo/swift-evolution
_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to