> On May 7, 2016, at 11:37 AM, Patrick Smith via swift-evolution 
> <swift-evolution@swift.org> wrote:
> 
> I think everyone possibly has different definitions of what ‘Swift-native 
> rethinking’ could involve? My thoughts are, the Swift standard library is a 
> base library of types and algorithms. There’s then a sister library that has 
> serialisation, file reading and writing, and HTTP networking, dates, and 
> more. At the moment that library is Foundation.
> 
> I think a good rule for Swift 3 has been, if some feature wasn’t already in, 
> would it be added now if freshly proposed? Is it too far to ask what would a 
> fresh take on Foundation look like?
> 
> There are certain things with Foundation that make it feel outdated or 
> possibly less Swift-like:
> - File references/paths are currently a part of NSURL. While this is 10 times 
> better than the old NSString API, isn’t it still a bit odd, and a bit 
> unfortunate to be bringing forward to Linux? There are a whole set of APIs of 
> NSURL that only apply to files, and other another set that only apply to 
> actual RFC 2396 URLs. Plus you have the NSFileManager APIs and the 
> NSURLSession APIs, one for files and one for web URLs, and they both use the 
> same type.
> - Why does the library Alamofire have 16,000 stars given that it uses the 
> relatively new API NSURLSession? Would a Swift Foundation aim to get a 
> similar API?
> - NSTask I think is a reasonable Objective-C API, but nowadays is verbose and 
> throws exceptions: https://www.shinobicontrols.com/blog/scripting-in-swift 
> <https://www.shinobicontrols.com/blog/scripting-in-swift>
> - NSUserDefaults is designed to write to file storage by a single client as 
> far as I know. i.e. would it be appropriate for a web server?

For what it’s worth, this isn’t true. NSUserDefaults supports concurrent access 
from arbitrary numbers of clients.

        David

> - Foundation is originally designed in a time before closures and before GCD. 
> It’s had some additions to work those features in, but they don’t feel like 
> Foundation has been based upon them.
> - Having two types, the [NS]OutputStream class, and the OutputStreamable 
> protocol, but they seemingly have nothing to do with each other? Why the 
> designs of one or both change so that NSOutputStream could conform to 
> OutputStreamable?
> - APIs such as NSOperation that rely on key value coding and observation.
> - NSOperationQueue, which back in its day added a nice Objective-C API over 
> dispatch queues, but today could probably be achieved by use of protocol 
> extensions and a smaller class that complement GCD?
> - NSSortDescriptor, designed using key value coding.
> 
> Matthew Johnson raised the possibility of a “split between those who favor 
> various libraries”. I take your point that “We are trying to avoid exactly 
> the split you are concerned about.”
> 
> I think it is worth listing what Swift-native thinking includes. Here are my 
> ideas based on what I’ve seen from the standard library and the community:
> - Modular protocol oriented design
> - Small focused APIs
> - Elegant use of closures
> - Explicit rejection of old conventions in order to find the best possible API
> - Value types of course, which we have coming thanks to the effort here
> - Ability to design with ‘micro’ value types, where objects would have been 
> cumbersome or inefficient in Objective-C.
> 
> I have a feeling that for developers who start by learn Swift conventions and 
> who know have exposure to other libraries and frameworks, that Foundation 
> will feel a bit foreign to them. I feel there will be a split between library 
> choices, as people go for something with more focused APIs that take 
> advantage of Swift more. Is the plan for Foundation to still be a core part 
> of Swift in the next 5+ years?
> 
> Foundation is a great API for the tools they had available with Objective-C 
> and thoughtful naming and design. I feel if someone were to design an API 
> given the current tools we have now, it would be very different.
> 
> I think modernising Foundation for Swift is a worthy effort, but seemingly 
> making it the defacto sister library to the standard library feels a bit odd.
> 
> 
>> On 8 May 2016, at 2:53 AM, Tony Parker via swift-evolution 
>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>> 
>>> 
>>> On May 7, 2016, at 6:06 AM, Jonathan Hull <jh...@gbis.com 
>>> <mailto:jh...@gbis.com>> wrote:
>>> 
>>> -1 on this as well.  How much does dropping NS really help things anyway?  
>>> 
>>> All it does is force everyone to learn which things still have NS and which 
>>> don’t.  It also makes things much more difficult to search for… searching 
>>> for NS_ gives the results you want quickly vs searching for anything in 
>>> Swift foundation (e.g. Array -- which gives you a mixture of other 
>>> programming languages and Taylor Swift gossip).
>>> 
>>> My proposal would be to keep NS for everything and then slowing making 
>>> versions without the prefix, either by rewriting them to be better in Swift 
>>> or simply aliasing the NS version.  Once you have critical mass for useful 
>>> things (around Swift 5~6), you can separate all the NSStuff out into their 
>>> own NSFoundation which would be used only for backwards compatibility.
>>> 
>>> To the inevitable question: Wont having NS and Non-NS versions be confusing 
>>> (especially if some are just aliases)?  My answer is that it is less 
>>> confusing than this proposal. There is a simple rule: Things without NS are 
>>> always the new and preferred methods. Things with NS are there for 
>>> compatibility and will continue to work the way they do in ObjectiveC (even 
>>> if you have to import “NSFoundation” to get them instead of just 
>>> “Foundation")
>>> 
>> 
>> I think that this approach ends up with confusion as well. Maybe we end up 
>> with UserDefaults and NSUserDefaults? One is written in Swift and other is 
>> not, but what difference would that make to the caller? Swift itself is not 
>> written completely in Swift. Instead, let’s have one UserDefaults that has 
>> an API appropriate for Swift. You’ve seen some of that already with changes 
>> to the names of its methods 
>> (https://github.com/apple/swift/blob/master/apinotes/Foundation.apinotes#L575
>>  
>> <https://github.com/apple/swift/blob/master/apinotes/Foundation.apinotes#L575>
>>  as one example, which takes advantage of overloading to simplify the API).
>> 
>>> Side Note: I would also REALLY like to see a swift native improvement on 
>>> NSAttributedString with native literal support.
>> 
>> NSAttributedString was part of the value types proposal at the beginning but 
>> deferred for a few practical reasons. One reason is that I want additional 
>> existential support in the language first. AttributedString has the concept 
>> of a “longest effective run”, which is calculated by checking for equality 
>> between attributes. Attributed string should allow for 
>> AnyEquatableAndCopyable members of its attribute dictionary. A second 
>> problem is that the entire Cocoa text system (and hundreds of higher level 
>> APIs) are based on top of the NSString Index concept, which is hidden behind 
>> the unicodeScalar view of Swift.String. I would like a more unified story of 
>> how these two can interoperate before we revamp the base type.
>> 
>> Both of these are solvable, but they require time to collaborate between 
>> teams to decide what the right platform-wide approach is. We’ll do it, but 
>> it will not happen immediately.
>> 
>>> 
>>>> There’s no question that we can improve Coding for Swift. I have actually 
>>>> explored this area quite a bit although I don’t have anything planned for 
>>>> Swift 3 at this time.
>>>> 
>>>> The general point is though, that we can do it by extending Foundation in 
>>>> that direction over time. In fact, keyed archiving is the perfect example 
>>>> of how we were able to do just that in the past in Objective-C. NSArchiver 
>>>> already existed and served a particular purpose, so we extended the 
>>>> concept into NSKeyedArchiver using the facilities available to us at the 
>>>> time.
>>> I would be curious to hear about your explorations (either in another 
>>> thread or offlist)
>>> 
>>> I have written a couple of experimental versions of an improved Coding 
>>> system for Swift.  The key idea is to use closures to allow coding of 
>>> arbitrarily complex nested types (e.g an array of tuples of Dictionaries: 
>>> [(String, [String:Int])] ).  It works pretty well, but unfortunately 
>>> currently taxes the compiler to the point where it randomly crashes during 
>>> compilation.  I am waiting for the new generics stuff to come online before 
>>> I explore further, since I believe that will dramatically simplify the code.
>>> 
>>> The other idea which I would like to see replicated is that it codes to an 
>>> intermediate format which can then be transformed to/from binary data, XML, 
>>> BSON (JSON + some representation for Binary Data) or some other format...
>>> 
>>> It also interoperates very well with existing NSCoding classes, which is an 
>>> important feature.
>>> 
>>> Thanks,
>>> Jon
>> 
>> One thing to think about here is what the role of NSCoding is in the first 
>> place. It was designed to support archiving of UI objects to nib files. It 
>> has been pressed into service for all kinds of other interesting tasks 
>> since; UI state restoration, document formats, and IPC wire protocol, to 
>> name a few. It may be worthwhile to decide if these are really all the same 
>> use case or not. I’m honestly not sure yet. Some of these are very focused 
>> on dynamic behavior (that is, the object graph is not known in advance). For 
>> some, custom object types are really important (NSXPC takes full advantage 
>> of this, and is basically its reason for existence over the raw libxpc API). 
>> For others it is not (a raw document file of one million double values). 
>> Some of these have different performance requirements than others (archiving 
>> fast is important to IPC but unarchiving fast is important to loading nib 
>> files). 
>> 
>> - Tony
>> 
>> 
>> 
>> 
>> 
>> 
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution@swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution

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

Reply via email to