Swift(八)is、as、Any、Anyobject、?、!

更新:2018.05.24

整理了一下demo:SwiftDemo


is、as、Any、Anyobject、?、!

后面的先不說,在swift的基礎語法方面,我最懵逼的就是這幾個東西了,放在一塊一起看一下。

1、is、as 類型檢查

  • 在swift中, 類型檢查是一種檢查實例類型的方式,同時也是讓實例作為它的父類或子類的一種方式。
  • Swift通過 isas來實現類型檢查。

直接上例子:
a -> 首先我們需要一個基類。

    class World {
        var name:String
        init(name:String) {
            self.name = name
        }
    }

b -> 夠大吧,定義了一個World基類,里面有一個屬性name并初始化init,然后我們還需要兩個子類:

    class Person:World {
        var food:String
        init(name:String, food:String) {
            self.food = food
            super.init(name: name)
        }
        
    }
    
    class Dog:World {
        var master:String
        init(name:String, master:String) {
            self.master = master
            super.init(name: name)
        }
    }

我們要使用is

c -> 我們定義了兩個子類,人和狗,好朋友,在PersonDog中分別添加了一個屬性foodmaster,并且初始化。然后,我們終于要用到is了,在這之前,我們還需要搞一個數組來存放這兩個類的實例,目的是使用is來判斷每個類型的個數。

        let arr:[World] = [
            Dog.init(name: "Benben", master: "Li"),
            Person.init(name: "Li", food: "apple"),
            Dog.init(name: "Dandan", master: "Han"),
            Person.init(name: "Han", food: "orange"),
            Person.init(name: "Liu", food: "banana")
        ]
        
        var dogNum:Int = 0
        var personNum:Int = 0
        for item in arr {
            
            if item is Dog {
                dogNum += 1
            } else {
                personNum += 1
            }
        }
        
        print(dogNum)
        print(personNum)

d -> 首先我們創建了一個數組,里面有人也有狗,人和狗有各自的數量,然后我們通過for循環遍歷數組,通過is關鍵字來判斷是人還是狗,并輸出各自的個數。

輸出結果:2,3

我們要使用as

        for item in arr {
            
            if item is Dog{
                let dog = item as! Dog
                print("Dog:\(dog.name), master:\(dog.master)")
            } else {
                let person = item as! Person
                print("Person:\(person.name), food:\(person.food)")
            }
        }

#輸出
Dog:Benben, master:Li
Person:Li, food:apple
Dog:Dandan, master:Han
Person:Han, food:orange
Person:Liu, food:banana

e -> 書上的例子不是這樣寫的,但我覺得這樣寫可能看的更清楚,還是這個for循環遍歷,我們使用as關鍵字給item 轉換成對應的類型。
這么來看的話就比較清除了,
is用來判斷類實例屬于哪個類型,
as負責將其轉換成其對應的類型。

2. Any和Anyobject

  • 有點類似OC中的id,Swift為不確定的類型,提供了兩種特殊別名,anyanyobject
  • Anyobject可以表示class類型的實例。
  • Any可以表示任何類型的實例。

前面我們定義數組時,如果數組中內容不確定,后面就加了Any

var arr = [Any]()

或者我們可以再多寫一點:

        var objects = [Any]()
        
        objects.append(3)
        objects.append(3.141592653)
        objects.append("圓周率")
        
        for item in objects {
            switch item {
            case let someInt as Int:
                print("This is Int class \(someInt)")
            case let someDouble as Double:
                print("This is Double class \(someDouble)")
            default:
                print("This is String class \(item)")
            }
        }
#輸出
This is Int class 3
This is Double class 3.141592653
This is String class 圓周率

3. ?和!

  • 在Swift中,我們用var來定義變量,但Swfit中并不會自動給變量賦初始值。 所以如果使用未賦值的變量就會報錯。
  • 所以他們搞了一個?,告訴你,我也不知道這個變量是不是有值,或者是什么類型的值。
  • 當你確定了這個變量確實有值要怎么辦?他們又搞了一個!,讓你告訴系統,我確定這個變量有值,出了事情我負責,然后,如果這個值是空的,他們就給你報錯,然后項目搞崩。氣不氣,氣不氣。
  • 我是這樣理解的,然后我們來看一個Optional類型,它是一個枚舉類型,這個類型只有兩個元素,NoneSome。就是說,nil對應Optional.None
        var password : String?
        print(password?.characters.count)

a -> 第一行中,我們定義了一個password,右側添加了?, 表示password變量屬于Optional類型,他的值可能是String類型,也可能是nil請注意此時的password不是String類型,而是Optional類型,對于一個Optional類型的變量,如果未被初始化,他的默認值是nil

b -> 在第二行代碼中,在password后面也加了一個,表示對password進行拆包,嘗試獲取Optional包中的String內容。

c -> 但因為password沒有被賦值,所以最為Optional類型的password默認值為nil。此時會跳過characters.count語句,直接輸出password的值,nil

當你使用!時,就表示你告訴編譯器,你確定 password一定不是nil,但是password的值就是nil,所以系統會報錯。

當我們給password進行賦值之后,

        var password : String?
        password = "123456"
        print(password!.characters.count)
#輸出
6

就沒有問題了


注意看圖片中,password輸出的是Optional中的some的值 123456

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容