UDN-企业互联网技术人气社区

板块导航

浏览  : 1127
回复  : 0

[讨论交流] 来自苹果的编程语言——Swift简介(二)

[复制链接]
唯吾┲逆天ぃ的头像 楼主
发表于 2015-12-4 16:54:50 | 显示全部楼层 |阅读模式
本帖最后由 唯吾┲逆天ぃ 于 2015-12-4 16:56 编辑

  ?的另一种用途
  
  使用可空值时,?可以出现在方法、属性或下标前面。如果?前的值为nil,那么?后面的表达式会被忽略,而原表达式直接返回nil,例如:
  
  1. let optionalSquare: Square? = Square(sideLength: 2.5, name: "optional
  2.   square")
  3.   let sideLength = optionalSquare?.sideLength
复制代码

  当optionalSquare为nil时,sideLength属性调用会被忽略。
  
  枚举和结构
  
  枚举
  
  使用enum创建枚举——注意Swift的枚举可以关联方法:
   
  1. enum Rank: Int {
  2.   case Ace = 1
  3.   case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten
  4.   case Jack, Queen, King
  5.   func simpleDescription() -> String {
  6.   switch self {
  7.   case .Ace:
  8.   return "ace"
  9.   case .Jack:
  10.   return "jack"
  11.   case .Queen:
  12.   return "queen"
  13.   case .King:
  14.   return "king"
  15.   default:
  16.   return String(self.toRaw())
  17.   }
  18.   }
  19.   }
  20.   let ace = Rank.Ace
  21.   let aceRawValue = ace.toRaw()
  22.   使用toRaw和fromRaw在原始(raw)数值和枚举值之间进行转换:
  23.   1
  24.   2
  25.   3
  26.   if let convertedRank = Rank.fromRaw(3) {
  27.   let threeDescription = convertedRank.simpleDescription()
  28.   }
复制代码

  
  注意枚举中的成员值(member value)是实际的值(actual value),和原始值(raw value)没有必然关联。
  
  一些情况下枚举不存在有意义的原始值,这时可以直接忽略原始值:
  
  1. enum Suit {
  2.   case Spades, Hearts, Diamonds, Clubs
  3.   func simpleDescription() -> String {
  4.   switch self {
  5.   case .Spades:
  6.   return "spades"
  7.   case .Hearts:
  8.   return "hearts"
  9.   case .Diamonds:
  10.   return "diamonds"
  11.   case .Clubs:
  12.   return "clubs"
  13.   }
  14.   }
  15.   }
  16.   let hearts = Suit.Hearts
  17.   let heartsDescription = hearts.simpleDescription()
复制代码

  除了可以关联方法,枚举还支持在其成员上关联值,同一枚举的不同成员可以有不同的关联的值:
  
  1. [code]enum ServerResponse {
  2.   case Result(String, String)
  3.   case Error(String)
  4.   }
  5.   let success = ServerResponse.Result("6:00 am", "8:09 pm")
  6.   let failure = ServerResponse.Error("Out of cheese.")
  7.   switch success {
  8.   case let .Result(sunrise, sunset):
  9.   let serverResponse = "Sunrise is at \(sunrise) and sunset is at \(sunset)."
  10.   case let .Error(error):
  11.   let serverResponse = "Failure... \(error)"
  12.   }
复制代码
  结构
  
  Swift使用struct关键字创建结构。结构支持构造器和方法这些类的特性。结构和类的最大区别在于:结构的实例按值传递(passed by value),而类的实例按引用传递(passed by reference)。
   
  1. struct Card {
  2.   var rank: Rank
  3.   var suit: Suit
  4.   func simpleDescription() -> String {
  5.   return "The \(rank.simpleDescription()) of \(suit.simpleDescription())"
  6.   }
  7.   }
  8.   let threeOfSpades = Card(rank: .Three, suit: .Spades)
  9.   let threeOfSpadesDescription = threeOfSpades.simpleDescription()
复制代码

  
  协议(protocol)和扩展(extension)
  
  协议
  
  Swift使用protocol定义协议:
   
  1. protocol ExampleProtocol {
  2.   var simpleDescription: String { get }
  3.   mutating func adjust()
  4.   }
复制代码


  类型、枚举和结构都可以实现(adopt)协议:
  
  1. class SimpleClass: ExampleProtocol {
  2.   var simpleDescription: String = "A very simple class."
  3.   var anotherProperty: Int = 69105
  4.   func adjust() {
  5.   simpleDescription += " Now 100% adjusted."
  6.   }
  7.   }
  8.   var a = SimpleClass()
  9.   a.adjust()
  10.   let aDescription = a.simpleDescription
  11.   struct SimpleStructure: ExampleProtocol {
  12.   var simpleDescription: String = "A simple structure"
  13.   mutating func adjust() {
  14.   simpleDescription += " (adjusted)"
  15.   }
  16.   }
  17.   var b = SimpleStructure()
  18.   b.adjust()
  19.   let bDescription = b.simpleDescription
复制代码

  
  扩展
  
  扩展用于在已有的类型上增加新的功能(比如新的方法或属性),Swift使用extension声明扩展:
  
  1. extension Int: ExampleProtocol {
  2.   var simpleDescription: String {
  3.   return "The number \(self)"
  4.   }
  5.   mutating func adjust() {
  6.   self += 42
  7.   }
  8.   }
复制代码

  
  7.simpleDescription
  
  泛型(generics)
  
  Swift使用<>来声明泛型函数或泛型类型:
   
  1. func repeat<ItemType>(item: ItemType, times: Int) -> ItemType[] {
  2.   var result = ItemType[]()
  3.   for i in 0..times {
  4.   result += item
  5.   }
  6.   return result
  7.   }
  8.   repeat("knock", 4)
复制代码

  Swift也支持在类、枚举和结构中使用泛型:
  
  1. // Reimplement the Swift standard library's optional type
  2.   enum OptionalValue<T> {
  3.   case None
  4.   case Some(T)
  5.   }
  6.   var possibleInteger: OptionalValue<Int> = .None
  7.   possibleInteger = .Some(100)
复制代码

  有时需要对泛型做一些需求(requirements),比如需求某个泛型类型实现某个接口或继承自某个特定类型、两个泛型类型属于同一个类型等等,Swift通过where描述这些需求:
   
  1. func anyCommonElements <T, U where T: Sequence, U: Sequence, T.GeneratorType.Element: Equatable, T.GeneratorType.Element == U.GeneratorType.Element> (lhs: T, rhs: U) -> Bool {
  2.   for lhsItem in lhs {
  3.   for rhsItem in rhs {
  4.   if lhsItem == rhsItem {
  5.   return true
  6.   }
  7.   }
  8.   }
  9.   return false
  10.   }
  11.   anyCommonElements([1, 2, 3], [3])
复制代码

  Swift语言概览就到这里,有兴趣的朋友请进一步阅读The Swift Programming Language。
 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部