加载中 ...
首页 > 新闻资讯 > 软件定制 正文

Xcode 8.0 Beta发布,详解Swift语言的重大变化

2019-03-25 10:23:49 来源:沈阳软件公司 作者:沈阳软件开发

  

  let x = NSFoo(value: NSNumber(integer: 0))

  

  let y: AnyObject = x

  

  let z = y as! NSFoo // Succeeds

  

  Swift中的子类仅能继承自ObjC泛型类中指定了全泛型列表参数的泛型类。

  

  // 错误:因为这里泛型参数没有明确化

  

  class SwiftFoo1<T>: NSFoo<T> { }

  

  // 正确:这里的泛型参数明确化了

  

  class SwiftFoo2<T>: NSFoo<NSString> { }

  

  Swift可以扩展ObjC的泛型类,但是这时的扩展不能增加约束特性,并且扩展定义内部不能访问泛型参数。

  

  extension NSFoo {

  

  //错误:不能访问泛型参数T

  

  func foo() -> T

  

  {   ret软件开发

<a href=http://www.hvihi.com target=_blank class=infotextkey>沈阳<a href=http://www.hvihi.com target=_blank class=infotextkey>软件开发</a></a>,<a href=http://www.hvihi.com target=_blank class=infotextkey>沈阳<a href=http://www.hvihi.com target=_blank class=infotextkey>软件公司</a></a>

urn T() } }

  

  // 错误:不能为扩展增加约束

  

  NSFoo where T: NSString { }

  

  }

  

  Foundation中的容器NS[Mutable]Array, NS[Mutable]Set, and NS[Mutable]Dictionary依然以非泛型的方式导入到Swift中。

  

  类型UnsafePointer、UnsafeMutablePointer、AutoreleasingUnsafeMutablePointer、OpaquePointer、Selector和NSZone被表示为非空指针,所谓非空指针指这些指针类型变量永远不能为nil。而可为空指针被表示为可选类型,例如:UnsafePointer?。对于C类型指针中的基本类型指针要注意它们的可为空特性:

  

  一个被标记为_Nonnull的指针或者放在NS_ASSUME_NONNULL_BEGIN/_END块中的指针将会以非可选类型的方式导入。

  

  例如::NSInteger * _Nonnull 被导入为UnsafeMutablePointer。

  

  一个被标注为_Nullable的指针被导入为可选类型值。例如:NSInteger * _Nullable将会被导入为UnsafeMutablePointer?。

  

  一个被标记为_Null_unspecified的指针或者不处于任何NS_ASSUME_NONNULL_BEGIN/_END块中的指针将会以隐式解封可选类型值得方式导入到Swift中,例如:NSInteger * _Null_unspecified将会被导入为:UnsafeMutablePointer!。

  

  如果想给一个使用C类型参数的函数传递一个可空类型的指针,Swift不允许直接传递需指定指针的宽度和类型,这里以Int类型的指针的为例:

  

  Int(bitPattern: nullablePointer)

  

  注释会被看作为空格,所以下面这种方式是正确的:

  

  if /*comment*/!foo { ... }

  

  1 +/*comment*/2

  

  但是如果用在一元操作符中则不行,比如:

  

  foo/* comment */! // no longer works

  

  关于inout参数标记符号移到了“:“之后参数类型之前,如:

  

  func foo(inout x: Int) { }

  

  改为:

  

  func foo(x: inout Int) { }

  

  @noescape 和@autoclosure属性现在必须用在参数类型之前而不是参数名称之前。

  

  被导入为NS_OPTIONS set类型中none成员现在不能用了,现在直接使用“[]”而不是调用none成员。

  

  对于属性赋值现在现在采用”:”而不是“=”,这种用法和函数参数调用保持一致了。[SE-0040]

  

  现在支持泛型别名了,例如:[SE-0048]

  

  typealias StringDictionary = Dictionary

  

  typealias IntFunction = (T) -> Int

  

  typealias MatchingTriple = (T, T, T)

  

  typealias BackwardTriple = (T3, T2, T1)

  

  @noescape属性可以扩展到很多泛型类型中,你现在可以声明一个@noescape属性的函数类型值,比如对于柯里化函数的签名,当然你也可以声明具有@noescape属性的本地变量,也可以把@noescape用在类型别名中,例如:

  

  func apply(f: @noescape T -> U,

  

  g: @noescape (@noescape T -> U) -> U) -> U

  

  {

  

  return g(f)

  

  }

  

  对于异常处理模块,可以在catch语句的rethrows函数中抛出错误,例如:

  

  func process(f: () throws -> Int)

  

  rethrows -> Int {

  

  do { return try f()

  

  }catch is SomeError

  

  {

  

  throw OtherError()

“沈阳软件公司”的新闻页面文章、图片、音频、视频等稿件均为自媒体人、第三方机构发布或转载。如稿件涉及版权等问题,请与

我们联系删除或处理,客服QQ:55506560,稿件内容仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同

其观点或证实其内容的真实性。