Issue #25 02 Jun 2016
Written by: Jesse Squires
Welcome to issue #25!
Starter tasks
- SR-1615: CoreFoundation should be audited for platform and architecture switches
- SR-1608:
NSStream
,NSInputStream
, andNSOutputStream
need implementations - SR-1602:
NSEnergyFormatter
needs to be implemented
Submit a task by sending a pull request or opening an issue.
Commits and pull requests
Slava Pestov finished adding support in SILGen for nested generic functions. His update to the changelog provides an example of the new functionality that this enables.
Trent Nadeau completed the final part of the implementation for SE-0047, removing @warn_unused_result
and adding a fixit.
Robert Widmann merged a pull request to provide a better diagnostic for nil
comparisons when attempting to use ===
for value types.
Nate Cook fixed an error in the nextUp
and nextDown
implementation.
Chris Williams opened a pull request to implement SE-0080: Failable Numeric Conversion Initializers.
Robert Widmann fixed an off-by-one error in the @noescape
fixit.
Accepted proposals
Max Moiseev’s proposal, SE-0093: Adding a public base
property to slices, was accepted for Swift 3.
There was little feedback from the community other than to get clarification. The core team recognizes the proposal as exposing an important basis operation of slice types.
Erica Sadun’s proposal, SE-0096: Converting dynamicType
from a property to an operator, was accepted with revision.
The feedback on the community on the proposal was very light, but there were significant concerns about its name. After discussion, the core team agrees that
x.dynamicType
should use the syntax of a global function as stated by the proposal, but would prefer for that function to be spelledtype(of: x)
to follow the naming guidelines. The rationale is:
- The function is side-effect free, so it should have a noun that describes what is returned.
- “type” is ambiguously a noun, verb, and perhaps other things, so the “of” preposition is necessary for clarity.
Returned proposals
Erica Sadun’s and Xiaodi Wu’s proposal, SE-0050: Decoupling Floating Point Strides from Generic Implementations, was returned for revision.
There was very little feedback from the community — the feedback was positive about solving the floating point error accumulation problem indicated by the proposal, but wasn’t strongly positive about the solution. The core team also agrees that the problem needs to be solved, however they don’t think this API change is the right approach. […] Once the design of this iterates on swift-evolution, it would be great to see a revised version of this proposal.
Adrian Zubarev’s and Austin Zheng’s proposal, SE-0095: Replace protocol<P1,P2>
syntax with Any<P1,P2>
, was returned for revision, with the intent that the revised proposal will be included for Swift 3. I recommend following the link to read Chris Lattner’s full response.
There was an incredible amount of feedback from the community, continuing even today. The principle problem identified by community about the proposal is that
Any<T1, T2>
implies very strongly an “any of T1 OR T2” relationship (aka disjunction) and not “any type conforming to T1 AND T2” relationship (aka conjunction). There was also some related discussion as to how theAny<>
syntax aligns with future generalized existential syntax, much discussion as to whether it should be spelledAny<>
orany<>
, and some discussion about “angle bracket blindness”.The core team extensively discussed the feedback and considered many different possible paths forward. The conclusion of this is that it recommends that SE-0095 be revised into a fairly different proposal, one that introduces a new infix
&
type operator for representing protocol and other type compositions…
Rejected proposals
Proposal SE-0098: Lowercase didSet
and willSet
for more consistent keyword casing was rejected.
The feedback on the proposal from both the core team and the community was that these should remain camel cased, particularly given that they may become user-definable aspect names in a future release.
Proposal SE-0097: Normalizing naming for “negative” attributes was rejected for Swift 3.
The core team agrees with the principle guiding the proposal (that negative attributes should start with “non” instead of “no”) and highly values standardized naming for attributes. The community was lukewarm about “nonescaping” but pretty significantly opposed to “nonreturning”.
The core team discussed this at length and agreed that the problem identified by the proposal needs to be solved, but prefers to explore directions that would define away these attributes completely:
For noreturn, the core team prefers to explore a solution where a function can be declared as returning an non-constructable “bottom” type (e.g. an enum with zero cases). This would lead to something like:
func abort() -> NoReturn { … }
. This will require some new support in the compiler, but should flow better through the type system than@noreturn
in function composition and other applications. Joe Groff offered to write a proposal for this.For
@noescape
, the core team feels that the right solution is for closure arguments to default to@noescape
, which means that the attribute we should really need is@escaping
.
Proposals in review
Erica Sadun’s and Chris Lattner’s proposal, SE-0099: Restructuring Condition Clauses, is under review.
Swift condition clauses appear in
guard
,if
, andwhile
statements. This proposal re-architects the condition grammar to enable an arbitrary mix of Boolean expressions,let
conditions (which test and unwrap optionals), generalcase
clauses for arbitrary pattern matching, and availability tests. It removeswhere
clauses from optional binding conditions and case conditions, and introduces semicolons (optionally newlines) between unrelated condition types rather than commas, which are reserved for continuation lists. This eliminates ambiguity problems in the current syntax, and alleviates the situation where many Swift developers don’t know they can use arbitrary Boolean conditions after a value binding.
Mailing lists
Harlan Haskins pitched an idea about introducing a #warning
compiler directive that would emit a warning diagnostic. This would serve a similar purpose as a // TODO
or // FIXME
comment, but produce an actual warning in Xcode. Jordan Rose gave a +1 to the proposal, noting how this could have a positive impact outside of IDEs like Xcode, for example with SwiftPM.
Tony Allevato drafted a proposal for automatically deriving Equatable
and Hashable
for certain value types. It’s an interesting idea, but certainly has challenging edge cases. There was some discussion over adding specific keywords to include or exclude which properties of a type are used in the Equatable
and Hashable
definitions, but this seems overly complicated. Becca Royal-Gordon warned early on to keep it simple. Patrick Smith suggested providing implementations by default, and allowing users to override.
Erica Sadun pitched an idea about adding a with
function to the standard library to address a common situation where developers want to duplicate and modify a constant value type (without having to use var
). (Gist here) Example:
Austin Zheng started a discussion on property reflection. “For those who are interested I’d like to present a pre-pre-proposal for reflection upon a type’s properties and solicit feedback. First of all, some caveats: this is only a very small piece of what reflection in Swift might look like one day, and it’s certainly not the only possible design for such a feature.” Here’s the gist of a rough, possible “KVC-like” API. Somebody tell Brent Simmons and Chris Eidhof. 😄
David Rönnqvist started a discussion on the difference between how static
and lazy
variables are evaluated when initially assigned with a different value. Briefly, stored properties evaluate first before assigning a new value, but lazy properties do not.
Finally
And finally — Did you ever realize that UIViewController
has troll in its name? 😂 It might be the biggest troll in all of UIKit. 😉