swift学习简单整理

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发送消息一样.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容