• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

WelcometoSwift(苹果官方Swift文档初译与注解六)---35~44页(第一章完) ...

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

在Swift中,使用struct 创建结构体类型;结构体支持的行为与类非常相似,都有成员方法与初始化;结构体与类最大的区别是在代码中使用结构体的时候,它总是会被拷贝;但是类在使用的时候,只是采用引用方式.

   struct Card {

      var rank: Rank

      var suit: Suit

      func simpleDescription() -> String {

          return "The \(rank.simpleDescription()) of \(suit.simpleDescription())"

      }

  }

  let threeOfSpades = Card(rank: .Three, suit: .Spades)

  let threeOfSpadesDescription = threeOfSpades.simpleDescription()

  EXPERIMENT // 练习题

  Add a method to Card that creates a full deck of cards, with one card of each combination of rank and suit. //给Card增加一个方法创建整副牌;并且带有一张包含rank 和suit的卡牌

一个枚举成员的实例可以拥有这个实例的关联值,多个枚举成员可以有不同的关联值;在创建成员实例的时候可以构建关联值.但是关联值与原始值是不同的:一个枚举成员的原始值,对于它的所有实例来说,都是相同的.并且,是你在定义枚举的时候构建的.

例如,有一种情况,从一个服务器上请求获取日出(sunrise)和日落(sunset)的时间,服务器要么响应信息,要么响应错误信息.

  enum ServerResponse {

      case Result(String, String)

      case Error(String)

  }

 

  let success = ServerResponse.Result("6:00 am", "8:09 pm")

  let failure = ServerResponse.Error("Out of cheese.")

 

  switch success {

  case let .Result(sunrise, sunset):

      let serverResponse = "Sunrise is at \(sunrise) and sunset is at \(sunset)."

  case let .Error(error):

      let serverResponse = "Failure...  \(error)"

  }

  EXPERIMENT // 练习题

  Add a third case to ServerResponse and to the switch. // 添加第三个case给 ServerResponse 和 switch

Protocols and Extensions  // 协议和扩展

使用protocol创建一个协议

  protocol ExampleProtocol {

      var simpleDescription: String { get }

      mutating func adjust()

  }

 

类,枚举,结构体都可以遵从协议;

  class SimpleClass: ExampleProtocol {

      var simpleDescription: String = "A very simple class."

    var anotherProperty: Int = 69105

      func adjust() {

          simpleDescription += "  Now 100% adjusted."

      }

  }

  var a = SimpleClass()

  a.adjust()

  let aDescription = a.simpleDescription

 

  struct SimpleStructure: ExampleProtocol {

      var simpleDescription: String = "A simple structure"

      mutating func adjust() {

          simpleDescription += " (adjusted)"

      }

  }

  var b = SimpleStructure()

  b.adjust()

  let bDescription = b.simpleDescription”

  EXPERIMENT  // 练习题

  Write an enumeration that conforms to this protocol. // 编写一个枚举,遵守协议;

注意在SimpleStructure结构体中使用的关键字 mutating(标记一个可以修改结构的方法), SimpleClass类的声明不需要任何标记 mutating的方法,因为类的方法总是可以修改类的.

使用extension给一个存在的类型添加功能,比如新的方法或者属性;也可以使用 extension 增加协议响应类型,甚至从库或者框架中导入的类型.

  extension Int: ExampleProtocol {

      var simpleDescription: String {

      return "The number \(self)"

      }

      mutating func adjust() {

          self += 42

      }

  }

  7.simpleDescription

  EXPERIMENT  // 练习题

  Write an extension for the Double type that adds an absoluteValue property. // 给Double类型写一个扩展,增加一个 absoluteValue属性;

可以使用协议名(就像使用其他类型名一样 )来创建一个包含多种数据类型的对象集合来遵守单一协议.当你处理的一个协议类型的值时,协议的外部方法是无法访问的.

  let protocolValue: ExampleProtocol = a

  protocolValue.simpleDescription

在上面的代码中,变量protocolValue即使是动态运行时的SimpleClass类型,但编译器仍然将它当做指定的类型ExampleProtocol.这意味着你不可以附加了协议的类的方法和属性.

Generics  // 泛型

在<>中填写一个名称可以来定义一个泛型函数或者类型;

  func repeat<ItemType>(item: ItemType, times: Int) -> ItemType[] {

      var result = ItemType[]()

      for i in 0..times {

          result += item

      }

      return result

  }

  repeat("knock", 4)

函数或者方法都可以使用泛型定义,(就像类,枚举和结构体它们一样)

   enum OptionalValue<T> {

      case None

      case Some(T)

  }

  var possibleInteger: OptionalValue<Int> = .None

  possibleInteger = .Some(100)

在类型名后面使用where关键字可以定义一个限制列表,例如,限制类型实现某一协议,或者要求两个类型相同,或者要求类继承某个父类.

  func anyCommonElements <T, U where T: Sequence, U: Sequence, T.GeneratorType.Element: Equatable, .GeneratorType.Element == U.GeneratorType.Element>   (lhs: T, rhs: U) -> Bool {

      for lhsItem in lhs {

          for rhsItem in rhs {

              if lhsItem == rhsItem {

                      return true

              }

          }

      }

      return false

  }

  anyCommonElements([1, 2, 3], [3])

  EXPERIMENT // 练习题

  Modify the anyCommonElements function to make a function that returns an array of the elements that any two sequences have in common.

        // 修改 anyCommonElements函数,让它返回一个数组,数组的元素任何的两个序列都相同.(此句翻译可能有误)

在上面的例子中,你可以忽略 where ,在冒号后面只写协议名或者类名.写法 <T: Equatable>与写法<T where T: Equatable>作用是相同的.

                     (本章完)

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
使用OC和swift创建系统自带的刷新界面发布时间:2022-07-13
下一篇:
高德地图api使用inswift发布时间:2022-07-13
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap