美文网首页
swift学习简单整理

swift学习简单整理

作者: Dottie22 | 来源:发表于2016-12-20 00:47 被阅读13次

    Swift的学习过程

    swift的学习:

    1. 常量: 用let关键字声明, 一旦声明(声明时必须初始化),即不可以修改值, 因为不能修改, 所以也不必指定具体类型, Swift会自动判断该常量值的类型.

      let country = "China"
      
    2. 变量: 用var关键字声明, 声明变量之后,定义其初始值的表达式, 在声明的同时初始化变量并不是必须的, 但是你必须在使用它之前进行初始化. 因为如果你这样做,Swift就可以推断变量的类型,这样就为你省掉了明确指定类型的麻烦.

          > 如下例子中: Swift推断str为一个字符串变量, 因为你已经将其初始化为一个字符串. 
          > 但是如果你不选择提供初始化,那么必须将变量类型添加在变量名之后,也就是用冒号:隔开
          > var str = "daejong"
          > var str : String?
          
      

    Optional类型

        1.Optional类型也是Objectvie-C没有的数据类型. 
        2.在OC中只有对象才能为nil, 而在Swift中,当基础类型(Int, Float, Bool等)没有值的时候, 也是nil.
        3.没有初始值的变量是不能够使用的. 于是乎就产生了Optional类型.
        4. 定义一个Optional的值很容易,只需要在类型后面加上问号即可(?).
    

    代码如下

    var str : String?
    

    一个Optional值和非Optional值的区别就在于: Optional值没有初始化时也是nil值, 但是普通的变量连nil都没有

    注意什么都没有的变量是不能被使用的, 一旦使用会报错

    代码如下

    //未被初始化,但是是一个Optional类型, 即为nil
    var str : String?
    str //nil
    //未被初始化, 也不是Optional类型
    var str2 : String
    str2 //使用时出错
    

    Optional的拆包

    • 显示拆包

      由于Optional类型的值不能被直接使用, 当需要的时候要显示拆包, 以表明我知道这个Optional是一定有值的.

      代码如下

      var str : String? = "daejong"
      str! //daejong
      
      //对比拆包前后, str的输出如下
      str //{Some :daejong"}
      str! // daejong
      

      之所以要拆包使用,因为Optional类型其实是一个枚举

      enum Optional<T> : Reflectable, NilLiteralConvertible {
      case None
      case Some(T)
      init()
      init(_ some: T)
      
      /// Haskell's fmap, which was mis-named
      func map<U>(f: (T) -> U) -> U?
      func getMirror() -> MirrorType
      static func convertFromNilLiteral() -> T?
      }
      

      当Optional没有值的时候, 返回的nil其实就是optional.None, 即没有值. 除了None之外,还有一个Some, 当有值的时候就是被Some<T>包装的真正的值, 所以这才需要我们进行拆包->将Some里面的值取出来(类似java中的泛型).

    • 隐式拆包

      除了显示拆包,Optional还提供了隐式拆包, 通过在声明变量的时候在数据类型后面加上一个感叹号来实现(!).

      代码如下

      var str : String! = "daejong"
      str //daejong
      

      其实这个语法等于告诉编译器: 在我们使用该Optional值之前, 这个Optional值就会被初始化,并且总会有值, 所以当我们使用该变量的时候, 编译器就会帮我们做一次拆包. 当然如果你确定你的变量在使用之前一定会被初始化(即有值), 那么大可这么做, 否则还是不要尝试为好.

    可选绑定 Optional Binding

    • 不用可选绑定的情况如下

      代码如下

      var count : Int?
      count = 1000
      if count != nil {
          "count is " + String(count!) //这里要进行显示拆包
      }
      

      为了避免在条件判断语句后执行一次或者多次的拆包, Swift引进了Optional Binding

    • 使用可选绑定 如下

      代码如下

      var count : Int?
      count = 1000
      if let validCount = count {
          "count is " + String(validCount) //注意这里的不同
      }   
      

      通过在条件判断语句中(if或者while等中)把Optional值直接赋值给一个临时常量, Swift会自动检测Optional是否包含值, 如果包含值, 则会隐式的拆包并赋值给那个临时常量, 这样就可以在接下来的下文中直接使用该临时常量了, 从而避免了一次次的显示拆包

      其实, Optional Bindiing中, 除了以常量的方式去接收拆包的值, 也可以用变量的形式去接收, 但是大多数情况下, 我们只是使用那个值就行了, 并不会去改变它.

    Optional Chaining

    • 用处:

      相对于简单类型(Int, String等), Optional更主要的应用场景是在复杂的对象上, 当一个对象包含另一个对象, 同时这个对象都有可能为nil的情况下才是Optional派上用场的地方. 在OC中,想nil发送消息得到是一个nil, 但是Swift不能在nil上直接调用方法或者属性, 从而引入了Optional类型, 来防止一个对象中的一个对象为nil情况的发生.

      代码如下

      //一个人
      class Person {
      var pet: Pet?
      }
      
      //一个人有一个宠物
      class Pet {
          var name: String!
          
          var favoriteToy: Toy?
          
          init (name: String) {
              self.name = name
          }
      }
      //一个宠物有一个玩具
      class Toy {
          var name: String!
          
          init (name: String) {
              self.name = name
          }
      }
      

      那么该如何过去到玩具的名称呢?

      代码如下

      let daejong = Person()
      daejong.pet = Pet(name : "dog")
      daejong.pet?.favoriteToy = Toy(name : "iPhone")
      if let pet = daejong.pet {
          if let toy = pet.favoriteToy {
              toy.name
          }
      }
      

      这里用到了两个if, 因为pet和toy对象都有可能为nil, 我们要预防每一个可能为nil的对象, 如果这个对象在复杂点, 那if的判断也就会跟着增多,

    • 但是如果使用Optional Chaining的话, 写出来就是如下效果:

      代码如下

      let daejong = Person()
      daejong.pet = Pet(name : "dog")
      daejong.pet?.favoriteToy = Toy(name : "iPhone")
      //这里进行一个Optional值调用另一个Optional值, 形成Optional Chaining
      if let toy = daejong.pet?.favoriteToy { 
          toy.name
      }
      

      当一个Optional值调用它的另外一个Optional值的时候, 这个时候 Optional Chaining就形成了. 基本上, Optional Chaining总是会返回一个Optional的值, 只要这个Chaining中有一个值为nil, 整条chain就为nil, 和OC中的向nil发送消息一样.

    相关文章

      网友评论

          本文标题:swift学习简单整理

          本文链接:https://www.haomeiwen.com/subject/ejrxvttx.html