forked from swiftlang/swift
-
Notifications
You must be signed in to change notification settings - Fork 0
/
buildbot-release-notes.txt
2059 lines (1522 loc) · 69.6 KB
/
buildbot-release-notes.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
Latest
------
* Designated class initializers declared as failable or throwing may now
return nil or throw an error, respectively, before the object has been
fully initialized. For example:
class Widget : Gadget {
let complexity: Int
init(complexity: Int, elegance: Int) throws {
if complexity > 3 { throw WidgetError.TooComplex }
self.complexity = complexity
try super.init(elegance: elegance)
}
}
* All slice types now have removeFirst() and removeLast() methods.
* ArraySlice.removeFirst() now preserves element indices.
* Global anyGenerator() functions have been changed into initializers on
AnyGenerator, making the API more intuitive and idiomatic.
* Closures appearing inside generic types and generic methods can now be
converted to C function pointers as long as no generic type parameters
are referenced in the closure's argument list or body. A conversion of
a closure that references generic type parameters now produces a
diagnostic instead of crashing.
(rdar://problem/22204968)
* Anonymously-typed members of C structs and unions can now be accessed
from Swift. For example, given the following struct 'Pie', the 'crust'
and 'filling' members are now imported:
struct Pie {
struct { bool crispy; } crust;
union { int fruit; } filling;
}
Since Swift does not support anonymous structs, these fields are
imported as properties named 'crust' and 'filling' having nested types
named 'Pie.__Unnamed_crust' and 'Pie.__Unnamed_filling'.
(rdar://problem/21683348)
*** Time warp: Changes between Xcode 6.1 (Swift 1.1) through Xcode 7.1
(Swift 2.1) have been lost. Contributions to rectify this would be
welcome.
2014-10-09 [Roughly Xcode 6.1, and Swift 1.1]
----------
* 'HeapBuffer<Value,Element>', 'HeapBufferStorage<Value,Element>', and
'OnHeap<Value>' were never really useful, because their APIs were
insufficiently public. They have been replaced with a single class,
'ManagedBuffer<Value,Element>'. See also the new function
'isUniquelyReferenced(x)' which is often useful in conjunction with
'ManagedBuffer'.
* The 'Character' enum has been turned into a struct, to avoid
exposing its internal implementation details.
* The 'countElements' function has been renamed 'count', for better
consistency with our naming conventions.
* Mixed-sign addition and subtraction operations, that were
unintentionally allowed in previous versions, now cause a
compilation error.
* OS X apps can now apply the @NSApplicationMain attribute to their app delegate
class in order to generate an implicit "main" for the app. This works like
the @UIApplicationMain attribute for iOS apps.
* Objective-C init and factory methods are now imported as failable
initializers when they can return nil. In the absence of information
about a potentially-nil result, an Objective-C init or factory
method will be imported as "init!".
As part of this change, factory methods that have NSError**
parameters, such as +[NSString
stringWithContentsOfFile:encoding:error:], will now be imported as
(failable) initializers, e.g.,
init?(contentsOfFile path: String,
encoding: NSStringEncoding,
error: NSErrorPointer)
* Nested classes explicitly marked @objc will now properly be included in a
target's generated header as long as the containing context is also
(implicitly or explicitly) @objc. Nested classes not explicitly marked @objc
will never be printed in the generated header, even if they extend an
Objective-C class.
* All of the *LiteralConvertible protocols, as well as
StringInterpolationConvertible, now use initializers for their
requirements rather than static methods starting with
"convertFrom". For example, IntegerLiteralConvertible now as the
following initializer requirement:
init(integerLiteral value: IntegerLiteralType)
Any type that previously conformed to one of these protocols will
need to replace its "convertFromXXX" static methods with the
corresponding initializer.
2014-09-15
----------
* Initializers can now fail by returning 'nil'. A failable initializer is
declared with 'init?' (to return an explicit optional) or 'init!' (to return
an implicitly-unwrapped optional). For example, you could implement
String.toInt as a failable initializer of Int like this:
extension Int {
init?(fromString: String) {
if let i = fromString.toInt() {
// Initialize
self = i
} else {
// Discard self and return 'nil'.
return nil
}
}
}
The result of constructing a value using a failable initializer then becomes
optional:
if let twentytwo = Int(fromString: "22") {
println("the number is \(twentytwo)")
} else {
println("not a number")
}
In the current implementation, struct and enum initializers can return nil
at any point inside the initializer, but class initializers can only return
nil after all of the stored properties of the object have been initialized
and 'self.init' or 'super.init' has been called. If 'self.init' or
'super.init' is used to delegate to a failable initializer, then the 'nil'
return is implicitly propagated through the current initializer if the
called initializer fails.
* The RawRepresentable protocol that enums with raw types implicitly conform
to has been redefined to take advantage of failable initializers. The
"fromRaw(RawValue)" static method has been replaced with an initializer
"init?(rawValue: RawValue)", and the "toRaw()" method has been replaced with
a "rawValue" property. Enums with raw types can now be used like this:
enum Foo: Int { case A = 0, B = 1, C = 2 }
let foo = Foo(rawValue: 2)! // formerly 'Foo.fromRaw(2)!'
println(foo.rawValue) // formerly 'foo.toRaw()'
2014-09-02
----------
* Characters can no longer be concatenated using "+". Use String(c1) +
String(c2) instead.
2014-08-18
---------
* When force-casting between arrays of class or @objc protocol types
using "a as [C]", type checking is now deferred until the moment
each element is accessed. Because bridging conversions from NSArray
are equivalent to force-casts from [NSArray], this makes certain
Array round-trips through Objective-C code O(1) instead of O(N).
2014-08-04
----------
* 'RawOptionSetType' now implements 'BitwiseOperationsType', so imported
NS_OPTIONS now support the bitwise assignment operators '|=', '&=',
and '^='. It also no longer implements 'BooleanType'; to check if an option
set is empty, compare it to 'nil'.
* Types implementing 'BitwiseOperationsType' now automatically support
the bitwise assignment operators '|=', '&=', and '^='.
* Optionals can now be coalesced with default values using the '??' operator.
'??' is a short-circuiting operator that takes an optional on the left and
a non-optional expression on the right. If the optional has a value, its
value is returned as a non-optional; otherwise, the expression on the right
is evaluated and returned:
var sequence: [Int] = []
sequence.first ?? 0 // produces 0, because sequence.first is nil
sequence.append(22)
sequence.first ?? 0 // produces 22, the value of sequence.first
* The optional chaining '?' operator can now be mutated through, like '!'.
The assignment and the evaluation of the right-hand side of the operator
are conditional on the presence of the optional value:
var sequences = ["fibonacci": [1, 1, 2, 3, 4], "perfect": [6, 28, 496]]
sequences["fibonacci"]?[4]++ // Increments element 4 of key "fibonacci"
sequences["perfect"]?.append(8128) // Appends to key "perfect"
sequences["cubes"]?[3] = 3*3*3 // Does nothing; no "cubes" key
Note that optional chaining still flows to the right, so prefix increment
operators are *not* included in the chain, so this won't type-check:
++sequences["fibonacci"]?[4] // Won't type check, can't '++' Int?
2014-07-28
----------
* The swift command line interface is now divided into an interactive driver
'swift', and a batch compiler 'swiftc':
swift [options] input-file [program-arguments]
Runs the script 'input-file' immediately, passing any program-arguments
to the script. Without any input files, invokes the repl.
swiftc [options] input-filenames
The familiar swift compiler interface: compiles the input-files according
to the mode options like -emit-object, -emit-executable, etc.
* For greater clarity and explicitness when bypassing the type system,
reinterpretCast has been renamed unsafeBitCast, and it has acquired
a (required) explicit type parameter. So
let x: T = reinterpretCast(y)
becomes
let x = unsafeBitCast(y, T.self)
* Because their semantics were unclear, the methods "asUnsigned" (on
the signed integer types) and "asSigned" (on the unsigned integer
types) have been replaced. The new idiom is explicit construction
of the target type using the "bitPattern:" argument label. So,
myInt.asUnsigned()
has become
UInt(bitPattern: myInt)
* To better follow Cocoa naming conventions and to encourage
immutability, The following pointer types were renamed:
UnsafePointer<T> => UnsafeMutablePointer<T>
ConstUnsafePointer<T> => UnsafePointer<T>
AutoreleasingUnsafePointer<T> => AutoreleasingUnsafeMutablePointer<T>
Note that the meaning of "UnsafePointer" has changed from mutable to
immutable. As a result, some of your code may fail to compile when
assigning to an UnsafePointer's ".memory" property. The fix is to
change your UnsafePointer<T> into an UnsafeMutablePointer<T>.
* The optional unwrapping operator 'x!' can now be assigned through, and
mutating methods and operators can be applied through it:
var x: Int! = 0
x! = 2
x!++
// Nested dictionaries can now be mutated directly:
var sequences = ["fibonacci": [1, 1, 2, 3, 0]]
sequences["fibonacci"]![4] = 5
sequences["fibonacci"]!.append(8)
* The @auto_closure attribute has been renamed to @autoclosure.
* There is a new 'dynamic' declaration modifier. When applied to a method,
property, subscript, or initializer, it guarantees that references to the
declaration are always dynamically dispatched and never inlined or
devirtualized, and that the method binding can be reliably changed at runtime.
The implementation currently relies on the Objective-C runtime, so 'dynamic'
can only be applied to @objc-compatible declarations for now. '@objc' now
only makes a declaration visible to Objective-C; the compiler may now use
vtable lookup or direct access to access (non-dynamic) @objc declarations.
class Foo {
// Always accessed by objc_msgSend
dynamic var x: Int
// Accessed by objc_msgSend from ObjC; may be accessed by vtable
// or by static reference in Swift
@objc var y: Int
// Not exposed to ObjC (unless Foo inherits NSObject)
var z: Int
}
'dynamic' enables KVO, proxying, and other advanced Cocoa features to work
reliably with Swift declarations.
* Clang submodules can now be imported:
import UIKit.UIGestureRecognizerSubclass
* The numeric optimization levels -O[0-3] have been removed in favor of the
named levels -Onone and -O.
* The -Ofast optimization flag has been renamed to -Ounchecked. We will accept
both names for now and remove -Ofast in a later build.
* An initializer that overrides a designated initializer from its
superclass must be marked with the 'override' keyword, so that all
overrides in the language consistently require the use of
'override'. For example:
class A {
init() { }
}
class B : A {
override init() { super.init() }
}
* Required initializers are now more prominent in several ways. First,
a (non-final) class that conforms to a protocol that contains an
initializer requirement must provide a required initializer to
satisfy that requirement. This ensures that subclasses will also
conform to the protocol, and will be most visible with classes that
conform to NSCoding:
class MyClass : NSObject, NSCoding {
required init(coder aDecoder: NSCoder!) { /*... */ }
func encodeWithCoder(aCoder: NSCoder!) { /* ... */ }
}
Second, because 'required' places a significant requirement on all
subclasses, the 'required' keyword must be placed on overrides of a
required initializer:
class MySubClass : MyClass {
var title: String = "Untitled"
required init(coder aDecoder: NSCoder!) { /*... */ }
override func encodeWithCoder(aCoder: NSCoder!) { /* ... */ }
}
Finally, required initializers can now be inherited like any other
initializer:
class MySimpleSubClass : MyClass { } // inherits the required init(coder:).
2014-07-21
----------
* Access control has been implemented.
- 'public' declarations can be accessed from any module.
- 'internal' declarations (the default) can be accessed from within the
current module.
- 'private' declarations can be accessed only from within the current file.
There are still details to iron out here, but the model is in place.
The general principle is that an entity cannot be defined in terms of another
entity with less accessibility.
Along with this, the generated header for a framework will only include
public declarations. Generated headers for applications will include public
and internal declarations.
* CGFloat is now a distinct floating-point type that wraps either a
Float (on 32-bit architectures) or a Double (on 64-bit
architectures). It provides all of the same comparison and
arithmetic operations of Float and Double, and can be created using
numeric literals.
* The immediate mode 'swift -i' now works for writing #! scripts that take
command line arguments. The '-i' option to the swift driver must now come at
the end of the compiler arguments, directly before the input filename. Any
arguments that come after -i and the input filename are treated as arguments
to the interpreted file and forwarded to Process.arguments.
* Type inference for for..in loops has been improved to consider the
sequence along with the element pattern. For example, this accepts
the following loops that were previously rejected:
for i: Int8 in 0..<10 { }
for i: Float in 0.0...10.0 { }
* Introduced the new BooleanLiteralConvertible protocol, which allows
user-defined types to support Boolean literals. "true" and "false"
are now Boolean constants and keywords.
* The "@final", "@lazy", "@required" and "@optional" attributes are now
considered to be declaration modifiers - they no longer require (or allow) an
@ sign.
* The "@prefix", "@infix", and "@postfix" attributes have been changed to
declaration modifiers, so they are no longer spelled with an @ sign. Operator
declarations have been rearranged from "operator prefix +" to
"prefix operator +" for consistency.
2014-07-03
----------
* C function pointer types are now imported as CFunctionPointer<T>, where 'T'
is a Swift function type. CFunctionPointer and COpaquePointer can be
explicitly constructed from one another, but they do not freely convert, nor
is CFunctionPointer compatible with Swift closures.
Example: "int (*)(void)" becomes "CFunctionPointer<(Int) -> Void>".
* The interop model for pointers in C APIs has been simplified. Most code that
calls C functions by passing arrays, UnsafePointers, or the addresses of
variables with '&x' does not need to change. However, the CConstPointer and
CMutablePointer bridging types have been removed, and functions and methods
are now imported as and overridden by taking UnsafePointer and
ConstUnsafePointer directly. Void pointers are now imported as
(Const)UnsafePointer<Void>; COpaquePointer is only imported for opaque types
now.
* Array types are now spelled with the brackets surrounding the
element type. For example, an array of Int is written as::
var array: [Int]
* Dictionary types can now be spelled with the syntax [K : V], where K
is the key type and V is the value type. For example:
var dict: [String : Int] = ["Hello" : 1, "World" : 2]
The type [K : V] is syntactic sugar for Dictionary<K, V>; nothing
else has changed.
* The @IBOutlet attribute no longer implicitly (and invisibly) changes the type
of the declaration it is attached to. It no longer implicitly makes variables
be an implicitly unwrapped optional and no longer defaults them to weak.
* The \x, \u and \U escape sequences in string literals have been consolidated
into a single and less error prone \u{123456} syntax.
2014-06-23
---------
* The half-open range operator has been renamed from ".." to "..<" to reduce
confusion. The ..< operator is precedented in Groovy (among other languages)
and makes it much more clear that it doesn't include the endpoint.
* Class objects such as 'NSObject.self' can now be converted to 'AnyObject' and
used as object values.
* Objective-C protocol objects such as 'NSCopying.self' can now be used as
instances of the 'Protocol' class, such as in APIs such as XPC.
* Arrays now have full value semantics: both assignment and
initialization create a logically-distinct object
* The "sort" function and array method modify the target in-place. A
new "sorted" function and array method are non-mutating, creating
and returning a new collection.
2014-05-19
----------
* sort, map, filter, and reduce methods on Arrays accept trailing
closures:
let a = [5, 6, 1, 3, 9]
a.sort{ $0 > $1 }
println(a) // [9, 6, 5, 3, 1]
println(a.map{ $0 * 2 }) // [18, 12, 10, 6, 2]
println(a.map{ $0 * 2 }.filter{ $0 < 10}) // [6, 2]
println(a.reduce(1000){ $0 + $1 }) // 1024 (no kidding)
* A lazy map() function in the standard library works on any Sequence.
Example:
class X {
var value: Int
init(_ value: Int) {
self.value = value
println("created X(\(value))")
}
}
// logically, this sequence is X(0), X(1), X(2), ... X(50)
let lazyXs = map(0..50){ X($0) }
// Prints "created X(...)" 4 times
for x in lazyXs {
if x.value == 4 {
break
}
}
* There's a similar lazy filter() function:
// 0, 10, 20, 30, 40
let tens = filter(0..50) { $0 % 10 == 0 }
let tenX = map(tens){ X($0) } // 5 lazy Xs
let tenXarray = Array(tenX) // Actually creates those Xs
* Weak pointers of classbound protocol type work now.
* IBOutlets now default to weak pointers with implicit optional type (T!).
* NSArray* parameters and result types of Objective-C APIs are now
imported as AnyObject[]!, i.e., an implicitly unwrapped optional
array storing AnyObject values. For example, NSView's constraints
property
@property (readonly) NSArray *constraints;
is now imported as
var constraints: AnyObject[]!
Note that one can implicitly convert between an AnyObject[] and an
NSArray (in both directions), so (for example) one can still
explicitly use NSArray if desired:
var array: NSArray = view.constraints
Swift arrays bridge to NSArray similarly to the way Swift
strings bridge to NSString.
* ObjCMutablePointer has been renamed AutoreleasingUnsafePointer.
* UnsafePointer (and AutoreleasingUnsafePointer)'s "set()" and "get()"
have been replaced with a property called "memory".
- Previously you would write:
val = p.get()
p.set(val)
- Now you write:
val = p.memory
p.memory = val
* Removed shorthand "x as T!"; instead use "(x as T)!"
- "x as T!" now means "x as implicitly unwrapped optional".
* Range operators ".." and "..." have been switched.
- 1..3 now means 1,2
- 1...3 now means 1,2,3
* The pound sign (#) is now used instead of the back-tick (`) to mark
an argument name as a keyword argument, e.g.,
func moveTo(#x: Int, #y: Int) { ... }
moveTo(x: 5, y: 7)
* Objective-C factory methods are now imported as initializers. For
example, NSColor's +colorWithRed:green:blue:alpha becomes
init(red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat)
which allows an NSColor to be created as, e.g.,
NSColor(red: 0.5, green: 0.25, blue: 0.25, alpha: 0.5)
Factory methods are identified by their kind (class methods), name
(starts with words that match the words that end the class name),
and result type (instancetype or the class type).
* Objective-C properties of some CF type are no longer imported as Unmanaged.
* REPL mode now uses LLDB, for a greatly-expanded set of features. The colon
prefix now treats the rest of the line as a command for LLDB, and entering
a single colon will drop you into the debugging command prompt. Most
importantly, crashes in the REPL will now drop you into debugging mode to
see what went wrong.
If you do have a need for the previous REPL, pass -integrated-repl.
* In a UIKit-based application, you can now eliminate your 'main.swift' file
and instead apply the '@UIApplicationMain' attribute to your
UIApplicationDelegate class. This will cause the 'main' entry point to the
application to be automatically generated as follows:
UIApplicationMain(argc, argv, nil,
NSStringFromClass(YourApplicationDelegate.self))
If you need nontrivial logic in your application entry point, you can still
write out a main.swift. Note that @UIApplicationMain and main.swift are
mutually exclusive.
2014-05-13
----------
* weak pointers now work with implicitly unchecked optionals, enabling usecases
where you don't want to ! every use of a weak pointer. For example:
weak var myView : NSView!
of course, they still work with explicitly checked optionals like "NSView?"
* Dictionary subscripting now takes/returns an optional type. This allows
querying a dictionary via subscripting to gracefully fail. It also enables
the idiom of removing values from a dictionary using 'dict[key] = nil'.
As part of this, 'deleteKey' is no longer available.
* Stored properties may now be marked with the @lazy attribute, which causes
their initializer to be evaluated the first time the property is touched
instead of when the enclosing type is initialized. For example:
func myInitializer() -> Int { println("hello\n"); return 42 }
class MyClass {
@lazy var aProperty = myInitializer()
}
var c = MyClass() // doesn't print hello
var tmp = c.aProperty // prints hello on first access
tmp = c.aProperty // doesn't print on subsequent loads.
c = MyClass() // doesn't print hello
c.aProperty = 57 // overwriting the value prevents it from ever running
Because lazy properties inherently rely on mutation of the property, they
cannot be 'let's. They are currently also limited to being members of structs
and classes (they aren't allowed as local or global variables yet) and cannot
be observed with willSet/didSet yet.
* Closures can now specify a capture list to indicate with what strength they
want to capture a value, and to bind a particular field value if they want to.
Closure capture lists are square-bracket delimited and specified before the
(optional) argument list in a closure. Each entry may be specified as "weak"
or "unowned" to capture the value with a weak or unowned pointer, and may
contain an explicit expression if desired. Some examples:
takeClosure { print(self.title) } // strong capture
takeClosure { [weak self] in print(self!.title) } // weak capture
takeClosure { [unowned self] in print(self.title) } // unowned capture
You can also bind arbitrary expression to named values in the capture list.
The expression is evaluated when the closure is formed, and captured with the
specified strength. For example:
// weak capture of "self.parent"
takeClosure { [weak tmp = self.parent] in print(tmp!.title) }
The full form of a closure can take a signature (an argument list and
optionally a return type) if needed. To use either the capture list or the
signature, you must specify the context sensitive 'in' keyword. Here is a
(weird because there is no need for unowned) example of a closure with both:
myNSSet.enumerateObjectsUsingBlock { [unowned self] (obj, stop) in
self.considerWorkingWith(obj)
}
* The word "with" is now removed from the first keyword argument name
if an initialized imported from Objective-C. For example, instead of
building UIColor as:
UIColor(withRed: r, green: g, blue: b, alpha: a)
it will now be:
UIColor(red: r, green: g, blue: b, alpha: a)
* `Dictionary` can be bridged to `NSDictionary` and vice versa:
- `NSDictionary` has an implicit conversion to `Dictionary<NSObject,
AnyObject>`. It bridges in O(1), without memory allocation.
- `Dictionary<K, V>` has an implicit conversion to `NSDictionary`.
`Dictionary<K, V>` bridges to `NSDictionary` iff both `K` and `V` are
bridged. Otherwise, a runtime error is raised.
Depending on `K` and `V` the operation can be `O(1)` without memory
allocation, or `O(N)` with memory allocation.
* Single-quoted literals are no longer recognized. Use double-quoted literals
and an explicit type annotation to define Characters and UnicodeScalars:
var ch: Character = "a"
var us: UnicodeScalar = "a"
2014-05-09
----------
* The use of keyword arguments is now strictly enforced at the call
site. For example, consider this method along with a call to it:
class MyColor {
func mixColorWithRed(red: Float, green: Float, blue: Float) { /* ... */ }
}
func mix(color: MyColor, r: Float, g: Float, b: Float) {
color.mixColorWithRed(r, g, b)
}
The compiler will now complain about the missing "green:" and
"blue:" labels, with a Fix-It to correct the code:
color.swift:6:24: error: missing argument labels 'green:blue:' in call
color.mixColorWithRed(r, g, b)
^
green: blue:
The compiler handles missing, extraneous, and incorrectly-typed
argument labels in the same manner. Recall that one can make a
parameter a keyword argument with the back-tick or remove a keyword
argument with the underscore.
class MyColor {
func mixColor(`red: Float, green: Float, blue: Float) { /* ... */ }
func mixColorGuess(red: Float, _ green: Float, _ blue: Float) { /* ... */ }
}
func mix(color: MyColor, r: Float, g: Float, b: Float) {
color.mixColor(red: r, green: g, blue: b) // okay: all keyword arguments
color.mixColorGuess(r, g, b) // okay: no keyword arguments
}
Arguments cannot be re-ordered unless the corresponding parameters
have default arguments. For example, given:
func printNumber(`number: Int, radix: Int = 10, separator: String = ",") { }
The following three calls are acceptable because only the arguments for
defaulted parameters are re-ordered relative to each other:
printNumber(number: 256, radix: 16, separator: "_")
printNumber(number: 256, separator: "_")
printNumber(number: 256, separator: ",", radix: 16)
However, this call:
printNumber(separator: ",", radix: 16, number: 256)
results in an error due to the re-ordering:
printnum.swift:7:40: error: argument 'number' must precede argument 'separator'
printNumber(separator: ",", radix: 16, number: 256)
~~~~~~~~~~~~~~ ^ ~~~
* ";" can no longer be used to demarkate an empty case in a switch statement,
use "break" instead.
2014-05-07
----------
* The compiler's ability to diagnose many common kinds of type check errors has
improved. ("expression does not type-check" has been retired.)
* Ranges can be formed with floating point numbers, e.g. "0.0 .. 100.0".
* Convenience initializers are now spelled as "convenience init" instead of with
the "-> Self" syntax. For example:
class Foo {
init(x : Int) {} // designated initializer
convenience init() { self.init(42) } // convenience initializer
}
You still cannot declare designated initializers in extensions, only
convenience initializers are allowed.
* Reference types using the CoreFoundation runtime are now imported as
class types. This means that Swift will automatically manage the
lifetime of a CFStringRef the same way that it manages the lifetime
of an NSString.
In many common cases, this will just work. Unfortunately, values
are returned from CF-style APIs in a wide variety of ways, and
unlike Objective C methods, there simply isn't enough consistency
for Swift to be able to safely apply the documented conventions
universally. The framework teams have already audited many of the
most important CF-style APIs, and those APIs should be imported
without a hitch into Swift. For all the APIs which haven't yet
been audited, we must import return types using the Unmanaged type.
This type allows the programmer to control exactly how the object
is passed.
For example:
// CFBundleGetAllBundles() returns an Unmanaged<CFArrayRef>.
// From the documentation, we know that it returns a +0 value.
let bundles = CFBundleGetAllBundles().takeUnretainedValue()
// CFRunLoopCopyAllModes() returns an Unmanaged<CFArrayRef>.
// From the documentation, we know that it returns a +1 value.
let modes = CFRunLoopCopyAllModes(CFRunLoopGetMain()).takeRetainedValue()
You can also use Unmanaged types to pass and return objects
indirectly, as well as to generate unbalanced retains and releases
if you really require them.
The API of the Unmanaged type is still in flux, and your feedback
would be greatly appreciated.
2014-05-03
----------
* The @NSManaged attribute can be applied to the properties of an
NSManagedObject subclass to indicate that they should be handled by
CoreData:
class Employee : NSManagedObject {
@NSManaged var name: String
@NSManaged var department: Department
}
* The @weak and @unowned attributes have become context sensitive keywords
instead of attributes. To declare a weak or unowned pointer, use:
weak var someOtherWindow : NSWindow?
unowned var someWindow : NSWindow
... with no @ on the weak/unowned.
2014-04-30
----------
* Swift now supports a #elseif form for build configurations, e.g.:
#if os(OSX)
typealias SKColor = NSColor
#elseif os(iOS)
typealias SKColor = UIColor
#else
typealias SKColor = Green
#endif
* You can now use the "true" and "false" constants in build configurations,
allowing you to emulate the C idioms of "#if 0" (but spelled "#if false").
* 'break' now breaks out of switch statements.
* It is no longer possible to specify "@mutating" as an attribute, you may only
use it as a keyword, e.g.:
struct Pair {
var x, y : Int
mutating func nuke() { x = 0; y = 0 }
}
The former "@!mutating" syntax used to mark setters as non-mutating is now
spelled with the "nonmutating" keyword. Both mutating and nonmutating are
context sensitive keywords.
* NSLog is now available from Swift code.
* The parser now correctly handles expressions like "var x = Int[]()" to
create an empty array of integers. Previously you'd have to use syntax like
"Array<Int>()" to get this. Now that this is all working, please prefer to
use Int[] consistently instead of Array<Int>.
* 'Character' is the new character literal type:
var x = 'a' // Infers 'Character' type
You can force inference of UnicodeScalar like this:
var scalar: UnicodeScalar = 'a'
'Character' type represents a Unicode extended grapheme cluster (to put it
simply, a grapheme cluster is what users think of as a character: a base plus
any combining marks, or other cases explained in Unicode Standard Annex #29).
2014-04-22
----------
* Loops and switch statements can now carry labels, and you can break/continue
to those labels. These use conventional C-style label syntax, and should be
dedented relative to the code they are in. An example:
func breakContinue(x : Int) -> Int {
Outer:
for a in 0..1000 {
Switch:
switch x {
case 42: break Outer
case 97: continue Outer
case 102: break Switch
case 13: continue // continue always works on loops.
case 139: break // break will break out of the switch (but see below)
}
}
}
* We are changing the behavior of 'break' to provide C-style semantics, to allow
breaking out of a switch statement. Previously, break completely ignored
switches so that it would break out of the nearest loop. In the example above,
'case 139' would break out of the "Outer" loop, not the "Switch".
In order to avoid breaking existing code, we're making this a compile time
error instead of a silent behavior change. If you need a solution for the
previous behavior, use labeled break.
This error will be removed in a week or two.
* Cocoa methods and properties that are annotated with the
NS_RETURNS_INNER_POINTER attribute, including -[NSData bytes] and
-[{NS,UI}Color CGColor], are now safe to use and follow the same lifetime
extension semantics as ARC.
2014-04-18
----------
* Enabling/disabling of asserts
assert(condition, msg)
is enabled/disabled dependent on the optimization level. In debug mode at
"-O0" asserts are enabled. At higher optimization levels asserts are disabled
and no code is generated for them. However, asserts are always type checked
even at higher optimization levels.
Alternatively, assertions can be disabled/enabled by using the frontend flag
"-assert-config Debug", or "-assert-config Release".
* Added optimization flag "-Ofast". It disables all assertions (assert), and
runtime overflow and type checks.
* The "selector-style" function and initializer declaration syntax is
being phased out. For example, this:
init withRed(red: CGFloat) green(CGFloat) blue(CGFloat) alpha(CGFloat)
will now be written as:
init(withRed red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat)
For each parameter, one can have both an argument API name (i.e.,
"withRed", which comes first and is used at the call site) and an
internal parameter name that follows it (i.e. "red", which comes
second and is used in the implementation). When the two names are
the same, one can simply write the name once and it will be used for
both roles (as with "green", "blue", and "alpha" above). The
underscore ("_") can be used to mean "no name", as when the
following function/method:
func murderInRoom(room:String) withWeapon(weapon: String)
is translated to:
func murderInRoom(_ room: String, withWeapon weapon: String)
The compiler now complains when it sees the selector-style syntax
and will provide Fix-Its to rewrite to the newer syntax.
Note that the final form of selector syntax is still being hammered
out, but only having one declaration syntax, which will be very
close to this, is a known.
* Stored properties can now be marked with the @NSCopying attribute, which
causes their setter to be synthesized with a copy to copyWithZone:. This may
only be used with types that conform to the NSCopying protocol, or option
types thereof. For example:
@NSCopying var myURL : NSURL
This fills the same niche as the (copy) attribute on Objective-C properties.
2014-04-16
----------
* Optional variables and properties are now default-initialized to nil:
class MyClass {
var cachedTitle: String? // "= nil" is implied
}
* @IBOutlet has been improved in a few ways:
- IBOutlets can now be @unchecked optional.
- An IBOutlet declared as non-optional, i.e.,
@IBOutlet var button: NSButton
will be treated as an @unchecked optional. This is considered to
be the best practice way to write an outlet, unless you want to explicitly
handle the null case - in which case, use "NSButton?" as the type. Either
way, the "= nil" that was formerly required is now implicit.
* The precedence of 'is' and 'as' is now higher than comparisons, allowing the
following sorts of things to be written without parens:
if x is NSButton && y is NSButtonCell { ... }
if 3/4 as Float == 6/8 as Float { ... }
* Objective-C blocks are now transparently bridged to Swift closures. You never
have to write @objc_block when writing Objective-C-compatible methods anymore.
Block parameters are now imported as unchecked optional closure types,
allowing 'nil' to be passed.
2014-04-09
----------
* Dictionary changes:
- Elements are now tuples, so you can write
for (k, v) in d {
// ...