设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客
LUPA开源社区 首页 IT综合资讯 查看内容

Xcode 6.3 Beta发布,Swift 1.2带来哪些新变化?

2015-2-10 21:25| 发布者: joejoe0332| 查看: 2830| 评论: 0|原作者: 王芳杰|来自: 未来眼之老码团队

摘要: 2月10日,苹果在面向开发者推送iOS 8.3 Beta的同时,还发布了版本号为6D520o的Xcode 6.3 Beta,其中便包含了iOS 8.3 Beta和OS X v10.10 SDK,并进一步提升了Swift与Objective-C代码的交互性,而Swift业已更新至1.2版 ...


为了完成桥接转换,需要用显式转化符标注:

  1. log(ns as String) // succeeds  

从Swift类型到Objective-C类型的桥接隐式转换依然被允许,比如:

  1. func nsLog(ns: NSString) { println(ns) }  
  2.  let s: String = “some String”  
  3.  nsLog(s) // okay: implicit conversion from String to NSString is still permitted  
  • @autoclosure现在标注在参数上,而不是标注在参数的类型上。比如:
  1. //以前我们这样写:  
  2.  func assert(predicate : @autoclosure () -> Bool) {… }  
  3. //现在需要这样写:  
  4.  func assert(@autoclosure predicate : () -> Bool) {… }  
  • 使用在函数参数上的 @autoclosure属性现在含有@noescape新属性的功能,这个改进限制了@autoclosure作为控制流程以及惰性计算的能力。
  • 柯里化函数现在可以指定参数标签了:
  1. func curryUnnamed(a: Int)(_ b: Int) { return a + b }  
  2. curryUnnamed(1)(2)  
  3. func curryNamed(first a: Int)(second b: Int) -> Int { return a + b }  
  4. curryNamed(first: 1)(second: 2)  
  • Swift现在可以检测在Swift类型系统中覆盖和重写的差异以及通过Objective-C运行时可见的影响。比如,下面Objective-C类中对属性的setter和类扩展中对方法的“setProperty”它们之间的冲突现在可以被诊断:
  1. class A : NSObject {  
  2.  var property: String = "Hello" // 注意: Objective-C 方法 'setProperty:’  
  3.  // 以前这里“属性”这里是通过setter声明  
  4.  }  
  5.  extension A {  
  6.  func setProperty(str: String) { } // 错误:方法"setProperty"  
  7.  // 重复声明了Objective-C方法  
  8.  //'setProperty:'  
  9.  }  

同样地检查在Objective-C中重写:

  1. class B : NSObject {  
  2. func method(arg: String) { } // 注意:重写操作  
  3. // 这里含有类型:'(String) -> ()'  
  4. }  
  5. class C : B {  
  6. func method(arg: [String]) { } // 错误: 重写的选择器方法含有不匹配的类型'([String]) -> ()'  
  7. }  

和协议的适配性一样:

  1. class MyDelegate : NSObject, NSURLSessionDelegate {  
  2.  func URLSession(session: NSURLSession, didBecomeInvalidWithError: Bool){ }  
  3.  // 错误:Objective-C 方法 'URLSession:didBecomeInvalidWithError:'  
  4.  //由方法提供: 'URLSession(_:didBecomeInvalidWithError:)'  
  5.  // 和可选类型的需求方法相冲突:  
  6.  // 'URLSession(_:didBecomeInvalidWithError:)' 在协议  
  7.  // 'NSURLSessionDelegate'  
  8.  }  

Swift语言Bug修复

  • 动态转换符(“as!”, “as?“和“is”)现在可以用在Swift的协议类型上,只要该协议类型没有关联类型。
  • 在Playground增加的一致性需求现在可以按照预期工作了,比如:
  1. struct Point {  
  2.  var x, y: Double  
  3.  }  
  4.  extension Point : Printable {  
  5.  var description: String {  
  6.  return "(\(x), \(y))"  
  7.  }  
  8.  }  
  9.  var p1 = Point(x: 1.5, y: 2.5)  
  10.  println(p1) // prints "(1.5, 2.5)”  
  • 导入的没有文档化的NS_ENUM类型,比如UIViewAnimationCurve,现在可以通过init(rawValue:) 构造器从它的原始整型类型转换出来而不会重设为nil,为解决这个问题而用替代方法unsafeBitCast编写的代码现在可以使用原始值构造器编写了。比如:
  1. let animationCurve =  
  2. nsafeBitCast(userInfo[UIKeyboardAnimationCurveUserInfoKey].integerValue,  
  3. UIViewAnimationCurve.self)  

现在可以写为:

  1. let animationCurve = UIViewAnimationCurve(rawValue:  
  2. userInfo[UIKeyboardAnimationCurveUserInfoKey].integerValue)!  
  • 在枚举类型中负浮点数可以用作原始值了。
  • 指向Objective-C类,或者Swift中继承自Objective-C对象的无主引用,在该无主引用指向的对象释放后无主引用被重新赋值时不会再Crash。
  • 含有观察访问器的变量或者属性如果它可以从初始值表达式中推断出类型就无需显式指定类型。
  • NSClassFromString函数搜索失败时其结果和nil的比较现在工作正常。
  • 子类中的重写基类含有可选类型的方法时,如果涉及到可选类型的转换将不会导致Crash。
  1. class Base {  
  2.  func foo(x: String) -> String? { return x }  
  3.  }  
  4.  class Derived: Base {  
  5.  override func foo(x: String?) -> String { return x! }  
  6.  } 



酷毙

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部