更新:2018.05.24
整理了一下demo:SwiftDemo
is、as、Any、Anyobject、?、!
后面的先不說,在swift的基礎語法方面,我最懵逼的就是這幾個東西了,放在一塊一起看一下。
1、is、as 類型檢查
- 在swift中, 類型檢查是一種檢查實例類型的方式,同時也是讓實例作為它的父類或子類的一種方式。
- Swift通過
is
、as
來實現類型檢查。
直接上例子:
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 -> 我們定義了兩個子類,人和狗,好朋友,在Person
和Dog
中分別添加了一個屬性food
和master
,并且初始化。然后,我們終于要用到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為不確定的類型,提供了兩種特殊別名,any
和anyobject
, -
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
類型,它是一個枚舉類型,這個類型只有兩個元素,None
和Some
。就是說,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
輸出的是Optiona
l中的some
的值 123456