Issue #22 12 May 2016
Written by: Jesse Squires
This week Ted Kremenek wrote an official blog post on the Swift 3.0 release process. It’s going to be an exciting release and it’s still scheduled to ship later this year. Unfortunately, it won’t be ready by WWDC 2016, but I’m sure we’ll have a decent beta by then.
The main Swift repository also surpassed 30,000 stars this week! That’s nearly double the amount of the next most popular programming language developed on GitHub. ⭐️⭐️⭐️ Here’s to an amazing community — Swift certainly is more than a programming language. 😊
For recently accepted proposals:
- SR-1489: Implement support for SE-0060, enforcing order of defaulted parameters.
- SR-1490: Implement SE-0076 by changing some
UnsafeMutablePointertaking methods to take
- SR-1491: Implement support for SE-0080, failable Numeric Conversion Initializers
From Danuel Duan:
- SR-1469: Diagnostic for
init?is reported at the end of the method despite an early return.
From Brian Gesiak:
- SR-1421: Document the
sourcekitd-testtool, which is used to quickly experiment with SourceKit. This task will involve writing a small amount of C++. You’ll learn about LLVM’s command line interface library and its argument parser, as well as about Swift’s SourceKit.
Commits and pull requests
Bhargav Gurlanka merged adding a JSON dumper for dependencies in SPM.
Brian Croom opened a pull request on corelibs-xctest to add the XCTest performance measurement APIs.
PJ Gray merged adding support for ARMv6 on linux in corelibs-foundation.
Nate Cook merged revisions to the documentation for core types and protocols.
Slava Pestov implemented closure reflection. (Note the pull request was closed, but the commits were merged manually.)
Michael Ilseman merged CoreGraphics API naming changes for the latest API naming guidelines.
Jordan Rose merged changes to allow importing pointer-returning methods as throwing.
The feedback on this proposal was positive - the benefits of simplifying the type system and eliminating surprising behavior from the compiler is universally appealing. However, both the core team and the community wanted a better sense of what the impact of the proposal would be in practice on real code. Joe Pamer did some analysis and found out that there isn’t a significant impact on the most concerning use case.
There was a significant amount of feedback on the proposal, with a fairly common theme of “lukewarm acceptance.” A number of community members were sad to see this familiar syntactic shortcut go away, but acknowledge that it fits well with recent directions, e.g., the elimination of the implicit tuple splat behavior SE-0029. The core team acknowledges that the ability to elide parentheses is not actively harmful to the language, but felt that it was better to have consistency around function types (always have parentheses) than provide a relatively small syntactic shortcut for higher-order functions. The core team did not feel that this proposal needed to include required parentheses within closures, which have their own fairly specific grammar.
The feedback on the proposal was generally positive (several people remarked that they didn’t know this was allowed). Some people pointed out that removal of this capability penalizes API design in cases where there is no inherent order to parameters, but this is also true of non-defaulted parameters. The core team prefers to encourage consistency at call sites.
The feedback on the proposal from the community and the core team universally agreed that there is a problem that needs to be solved here. However, instead of adding overloads of the methods as proposed, it would be better to change the existing methods to take
UnsafeMutablePointer<>. Given the existing promotion rules that exist in the compiler, it will achieve the same effect. As part of this, other similar functions in the standard library should be audited and fixed as well.
The feedback on the proposal from the community and the core team was universally positive, and the new initializers on the primitive integer and floating point types have been approved. However, swift-evolution isn’t the right mechanism to propose extensions to Foundation types, so the extensions that adds conversions from
NSNumberand to Foundation types should be subset out of the proposal.
Proposal SE-0073: Marking closures as executing exactly once was rejected for Swift 3. Though feedback from the community and core team was positive, the proposal was reject for two main reasons. Chris Lattner notes that he would like to this discussed for a future release, beyond Swift 3.
The surface level syntax of
@noescapeneeds to be reconsidered. At the minimum, we need to rename
@nonescapingfor consistency with our previously agreed attribute naming scheme. However, it is also work discussing whether
@nonescapingshould be the default: if so, the attribute should actually become
@escaping, and the functionality proposed in SE-0073 would be named
Separate from the surface level issues, the implementation underlying this work has some significant challenges that are doable but would require major engineering work. Specifically, the definite initialization pass needs to “codegen” booleans in some cases for conditional initialization/overwrite cases, and these state values would have to be added to closure capture lists. This would require enough engineering work that it seems unlikely that it would happen in the Swift 3 timeframe […]
The feedback on the proposal was generally positive about the concept of adding binary search functionality, but negative about the proposal as written, with feedback that it was adding too much complexity to the API.
Proposals in review
Tony Parker’s and Philippe Hausler’s proposal, SE-0086: Drop NS Prefix in Swift Foundation, is under review. “As part of Swift 3 API Naming and the introduction of Swift Core Libraries, we are dropping the NS prefix from key Foundation types in Swift.” Note that not all types are removing the prefix, only the ones specified in the proposal. Additionally, some types will be hoisted, or lifted up into a class container as a sub-type. For example,
NSCalendarUnit will become
Calendar.Unit. Surprisingly, there’s only mildly positive feedback on this so far with concerns from the community about reference versus value semantics for types that will receive a value-type (
struct) counterpart, as well as “inheriting” some unnecessary Objective-C legacy.
Matthew Johnson’s and Erica Sadun’s proposal, SE-0041: Updating Protocol Naming Conventions for Conversions, is under review. “We propose to expand and improve the naming conventions established by the API Guidelines and the standard library with regard to conversion related protocols. We believe common protocol naming patterns should be clear, consistent, and meaningful.” Their proposed solution includes establishing three protocol suffixes —
Representable — and renaming the protocols in the stdlib. So far there’s positive support from the community for bringing consistency here, but some debate about the naming of the suffixes. Programmers bikeshedding on how to name things? I know it’s hard to believe. 😄
Erica Sadun’s proposal, SE-0075: Adding a Build Configuration Import Test, is under review. Similar to using
#if os(iOS), Erica proposes adding a new configuration to test if modules are available. For example,
#if canImport(UIKit) would determine whether or not UIKit is supported on the current platform. Only David Hart and Xiaodi Wu have responded to this, but their feedback was positive.
Swift’s existing set of build configurations specify platform differences, not module commonalities. For example, UIKit enables you to write view code supported on both iOS and tvOS. SpriteKit allows common code to render on OS X, iOS, and tvOS that would require an alternate UI on Linux. Testing for Metal support or Media Player would guard code that will not function on the simulator. If the simulator adopted these modules at some future time, the code would naturally expand to provide compatible execution without source modification.
A proposal from David Hart, Robert Widmann, and Pry Jahkola, SE-0081: Move
where clause to end of declaration, is under review. The proposal suggests moving the
where clause that’s used to constrain generic type parameters to the end of the declaration syntax. The motivation here is that
where clauses can get quite long, which negatively impacts readability. Erica Sadun has a great post describing the issue. So far feedback from the community is positive, although Joe Groff raises a concern about how this will affect the type grammar. Here’s an example:
Dynamic casts using
isare currently able to dynamically perform Cocoa bridging conversions, such as from
NSStringor from an
ErrorProtocol-conforming type to
NSError. This functionality should be removed to make dynamic cast behavior simpler, more efficient, and easier to understand.
Grant Paul’s and Erica Sadun’s proposal, SE-0084: Allow trailing commas in parameter lists and tuples, is under review. “Swift permits trailing commas after the last element in array or dictionary literal. This proposal extends that to parameters and tuples.” There’s mixed feedback from the community on this proposal. Tony Allevato and Chris Lattner argue against these changes noting the structural differences between collections, parameters lists, and tuples. Rob Napier argues the benefits of having a general rule dictating “trailing commas are allowed in comma-separated lists”.
Matt Wright’s proposal, SE-0088: Modernize libdispatch for Swift 3 naming conventions, is under review. “The existing libdispatch module imports the C API almost verbatim. To move towards a more natural Swift interface and away from the C API, this proposal outlines changes to the libdispatch module and the motivation behind them.” I was surprised to see the mixed feedback from the community here, although it is more positive than negative. Concerns centered around the proposed naming (surprise! 😄) as well as general API churn. Dan Appel had an interesting idea about introducing
LibDispatch to retain the existing C APIs and
Dispatch for the Swifty versions of the APIs.
This is a proposal for changing the command names used for invoking the Swift package manager. Instead of hanging all functionality off of
swift test, we will introduce a new
swift packagecommand with multiple subcommands.
swift testwill remain as top-level commands due to their frequency of use.
And finally — mangled name or cat walking on keyboard? ⌨️ 🐈 😂