为了完成桥接转换,需要用显式转化符标注:从Swift类型到Objective-C类型的桥接隐式转换依然被允许,比如: - func nsLog(ns: NSString) { println(ns) }
- let s: String = “some String”
- nsLog(s)
- @autoclosure现在标注在参数上,而不是标注在参数的类型上。比如:
-
- func assert(predicate : @autoclosure () -> Bool) {… }
-
- func assert(@autoclosure predicate : () -> Bool) {… }
- 使用在函数参数上的 @autoclosure属性现在含有@noescape新属性的功能,这个改进限制了@autoclosure作为控制流程以及惰性计算的能力。
- 柯里化函数现在可以指定参数标签了:
- func curryUnnamed(a: Int)(_ b: Int) { return a + b }
- curryUnnamed(1)(2)
- func curryNamed(first a: Int)(second b: Int) -> Int { return a + b }
- curryNamed(first: 1)(second: 2)
- Swift现在可以检测在Swift类型系统中覆盖和重写的差异以及通过Objective-C运行时可见的影响。比如,下面Objective-C类中对属性的setter和类扩展中对方法的“setProperty”它们之间的冲突现在可以被诊断:
- class A : NSObject {
- var property: String = "Hello"
-
- }
- extension A {
- func setProperty(str: String) { }
-
-
- }
同样地检查在Objective-C中重写: - class B : NSObject {
- func method(arg: String) { }
-
- }
- class C : B {
- func method(arg: [String]) { }
- }
和协议的适配性一样: - class MyDelegate : NSObject, NSURLSessionDelegate {
- func URLSession(session: NSURLSession, didBecomeInvalidWithError: Bool){ }
-
-
-
-
-
- }
Swift语言Bug修复- 动态转换符(“as!”, “as?“和“is”)现在可以用在Swift的协议类型上,只要该协议类型没有关联类型。
- 在Playground增加的一致性需求现在可以按照预期工作了,比如:
- struct Point {
- var x, y: Double
- }
- extension Point : Printable {
- var description: String {
- return "(\(x), \(y))"
- }
- }
- var p1 = Point(x: 1.5, y: 2.5)
- println(p1)
- 导入的没有文档化的NS_ENUM类型,比如UIViewAnimationCurve,现在可以通过init(rawValue:) 构造器从它的原始整型类型转换出来而不会重设为nil,为解决这个问题而用替代方法unsafeBitCast编写的代码现在可以使用原始值构造器编写了。比如:
- let animationCurve =
- nsafeBitCast(userInfo[UIKeyboardAnimationCurveUserInfoKey].integerValue,
- UIViewAnimationCurve.self)
现在可以写为: - let animationCurve = UIViewAnimationCurve(rawValue:
- userInfo[UIKeyboardAnimationCurveUserInfoKey].integerValue)!
- 在枚举类型中负浮点数可以用作原始值了。
- 指向Objective-C类,或者Swift中继承自Objective-C对象的无主引用,在该无主引用指向的对象释放后无主引用被重新赋值时不会再Crash。
- 含有观察访问器的变量或者属性如果它可以从初始值表达式中推断出类型就无需显式指定类型。
- NSClassFromString函数搜索失败时其结果和nil的比较现在工作正常。
- 子类中的重写基类含有可选类型的方法时,如果涉及到可选类型的转换将不会导致Crash。
- class Base {
- func foo(x: String) -> String? { return x }
- }
- class Derived: Base {
- override func foo(x: String?) -> String { return x! }
- }
|