Swift中"?"和"!"
- 1.在swift中可選(optionals)類型猾昆,用"?"表示陶因,用于處理值缺失的情況,表示“這兒有一個(gè)值垂蜗,且它等于x”或者表示“這兒沒有值”
- 2.可選類型是一個(gè)包含兩種情況的枚舉值––None和Some楷扬,用來表示 可能有值 或 可能沒有值。
- 2.1 nil 就是 Optional.None,當(dāng)你聲明一個(gè)可選變量或者可選屬性的時(shí)候贴见,沒有提供初始值烘苹,它的值默認(rèn)為nil
- 2.2 非nil 就是Optional.Some
- 3.任何類型都可以明確的聲明為可選類型,當(dāng)聲明一個(gè)可選類型的時(shí)候片部,要確保用括號給"?"操作符一個(gè)合適的范圍镣衡。例如:聲明可選整數(shù)數(shù)組,應(yīng)該寫成"(Int[])?"档悠,如果寫成“Int[]?”,就會(huì)報(bào)錯(cuò)
//定義一個(gè)可選類型:以下兩種聲明方式是相等的
var Optional_1:Int?//在數(shù)據(jù)類型和"?"之間沒有空格
var Optional_2:Optional<Int>
- 4."!":用來表示強(qiáng)制解析廊鸥,如果可選類型實(shí)例包含一個(gè)值,可以用"?"來訪問這個(gè)值
//注意:如果可選類型在無值的情況下進(jìn)行強(qiáng)制解析站粟,會(huì)導(dǎo)致崩潰
var intNumber:Int? = 8
var result = intNumber!
print(result)
- 5.1 你可以在聲明可選變量時(shí)黍图,使用"!"來替換"?",這樣可選變量在使用時(shí)就不需要再加一個(gè)"!"來取值了奴烙,他會(huì)自動(dòng)解析
- 5.2 隱式解析可選類型好人可選類型一樣助被,都是有值和沒有值(nil)兩種結(jié)果
- 5.3 區(qū)別是賦值時(shí)剖张,隱式解析可選類型不需要再強(qiáng)制解析
- 5.4 注意:隱式解析可選類型的變量沒有值時(shí),程序一樣會(huì)崩潰
var IntNumberOne:Int! = 10
print(IntNumberOne)
- 6.1 可選綁定:用來判斷可選類型是否包含值揩环,如果包含就把值賦給一個(gè)臨時(shí)常量或者臨時(shí)變量搔弄。
- 6.2 可選綁定可以用在if 和 while 語句中來對可選類型的值進(jìn)行判斷,并把它賦給一個(gè)常量或者變量
- 6.3 如果你不確定可選類型是否有值丰滑,用可選綁定顾犹,不需要對可選類型強(qiáng)制解析
var intNumberTwo:Int?
if var intNumberThree = intNumberTwo{
print("可選類型有值 = \(intNumberThree)")
}else{
print("可選類型無值")
}
Swift中的結(jié)構(gòu)體
- 1.1 結(jié)構(gòu)體不需要實(shí)現(xiàn)文件和接口文件
- 1.2 結(jié)構(gòu)體允許我們創(chuàng)建一個(gè)單一文件,且系統(tǒng)會(huì)自動(dòng)生成該結(jié)構(gòu)體用于面向其他代碼的外部接口
- 2.結(jié)構(gòu)體總是通過被復(fù)制的方式在代碼中傳遞褒墨,因此炫刷,原本結(jié)構(gòu)的值是不可修改的
- 3.結(jié)構(gòu)體的應(yīng)用
- 3.1 在代碼中,可以使用結(jié)構(gòu)體定義你的自定義數(shù)據(jù)類型
- 3.2 按照通用的準(zhǔn)則郁妈,當(dāng)符合一條或者多條以下條件下時(shí)浑玛,請考慮構(gòu)建結(jié)構(gòu)體
- 3.2.1 結(jié)構(gòu)體的主要目的是用來封裝少量相關(guān)簡單數(shù)據(jù)
- 3.2.2 有理由預(yù)計(jì)一個(gè)結(jié)構(gòu)體實(shí)例在賦值或者傳遞時(shí),封裝的數(shù)據(jù)將會(huì)被拷貝而不是引用
- 3.2.3 任何結(jié)構(gòu)體中存儲(chǔ)的值類型屬性噩咪,也將會(huì)被拷貝顾彰,而不是被引用
- 3.2.4 結(jié)構(gòu)體不需要去繼承另一個(gè)已存在類型的屬性或者行為
- 4.例如:
- 4.1 幾何形狀的大小,封裝一個(gè)width屬性和height屬性胃碾,兩者均為Double類型
- 4.2 一定范圍的路徑涨享,封裝一個(gè)Start屬性和length屬性,兩者均為Int類型
- 4.3 三維坐標(biāo)系內(nèi)的一點(diǎn)仆百,x,y,z屬性厕隧,三者均為Double類型
//聲明一個(gè)結(jié)構(gòu)體
struct pointOf3D {
//聲明結(jié)構(gòu)體變量的屬性(存儲(chǔ)屬性)
var X:Double
var Y:Double
var Z:Double
}
var point:pointOf3D = pointOf3D(X: 10, Y: 11, Z: 12)
//聲明一個(gè)結(jié)構(gòu)體
struct Rect {
var point:(x:Int,y:Int) = (0,0)
var size:(w:Int,h:Int) = (0,0)
//成員方法
func getSize(){
print(size)
}
//類方法:用static修飾
static func sayHello(){
print("hello")
}
}
var rect2:Rect = Rect(point: (10,10), size: (50,50))
//調(diào)用成員方法
rect2.getSize()
//調(diào)用類方法(類方法用類名直接調(diào)用,在結(jié)構(gòu)體里用結(jié)構(gòu)體調(diào)用)
Rect.sayHello()
Swift中的類
- 1.swift中儒旬,類和結(jié)構(gòu)體有很多共同點(diǎn)
- 1.1 定義屬性栏账,用于存儲(chǔ)值
- 1.2 定義方法,用于提供功能
- 1.3 定義構(gòu)造器栈源,用于提供初始化值
- 1.4 遵循協(xié)議挡爵,用來對某個(gè)類提供標(biāo)準(zhǔn)功能
- 1.5 通過擴(kuò)展,用來增加默認(rèn)實(shí)現(xiàn)的功能
- 2.與結(jié)構(gòu)體相比甚垦,又有其他附加功能
- 2.1 繼承允許一類繼承另一個(gè)類的特征
- 2.2 類型轉(zhuǎn)換允許在允許時(shí)檢查和解釋一個(gè)類實(shí)現(xiàn)的類型
- 2.3 引用計(jì)數(shù):允許對一個(gè)類多次引用
//定義一個(gè)雷:使用class修飾類
class Person{
var name:String?
var gender:String?
var age:Int?
}
- 3.1 該類型的每個(gè)實(shí)例持有數(shù)據(jù)的副本茶鹃,并且該副本對于每個(gè)實(shí)例來說都是唯一的一份,比如結(jié)構(gòu)體艰亮,枚舉闭翩,元組都是值類型
- 3.2 值類型的使用場景
- 3.2.1 當(dāng)使用“==”運(yùn)算符比較實(shí)例數(shù)據(jù)的時(shí)候
- 3.2.2 想單獨(dú)賦值一份實(shí)例數(shù)據(jù)的時(shí)候
- 3.2.3 在多線程環(huán)境下操作數(shù)據(jù)的時(shí)候
struct StructObject {
var data:Int = -1
}
var value_1 = StructObject()
//將value_1的值賦給value_2,就是一個(gè)拷貝的過程
var value_2 = value_1
print(value_2)
//value_1的數(shù)據(jù)改變迄埃,而value_2沒有改變
value_1.data = 1
print("\(value_1.data)...\(value_2.data)")
- 4.引用類型
該類型的實(shí)例共享數(shù)據(jù)唯一的一份副本疗韵。比如說類(class)就是引用類型
class ClassObject {
var data:Int = -1
}
var cob_1 = ClassObject()
//將cob_1變量的值賦給cob_2,就是引用的過程
var cob_2 = cob_1
//將cob_1的值改變,cob_2的值也改變了
cob_1.data = 4
print("\(cob_1.data)...\(cob_2.data)")
//定義一個(gè)類
class animal{
var kind:String?
var name:String?
//類的構(gòu)造方法(類似初始化方法)侄非,與OC中的構(gòu)造器不同蕉汪,Swift的構(gòu)造器無需返回值流译,他們的主要任務(wù)是保證新實(shí)例在第一次使用前完成正確的初始化
init(kind:String,name:String){
self.kind = kind
self.name = name
}
}
//創(chuàng)建實(shí)例對象
var lion = animal(kind: "大型貓科", name: "獅子")
//訪問對象的屬性
print(lion.name)
- 6.存儲(chǔ)屬性:存儲(chǔ)屬性就是類或者結(jié)構(gòu)體里定義的變量(或者常量)
- 6.1 存儲(chǔ)屬性可以是變量存儲(chǔ)屬性(var修飾),也可以是常量存儲(chǔ)屬性(let修飾)
- 6.2 可以在定義存儲(chǔ)屬性的時(shí)候指定默認(rèn)值
- 6.3 也可以在構(gòu)造過程中設(shè)置或修改存儲(chǔ)屬性的值
- 7.計(jì)算屬性:不直接存儲(chǔ)值者疤,而是提供一個(gè)getter 和一個(gè)可選的setter福澡,來間接獲取和設(shè)置其他屬性常量或變量的值
class Docter{
//類方法
static var age:Int?
//對象方法
var name:String?
//計(jì)算屬性
var Number:String{
get{
return name!
}
set(value){//這種寫法表示在調(diào)用Number的set方法時(shí),傳過來的參數(shù)會(huì)賦給value
name = value//切記:set\get方法中萬不能適應(yīng)"self.屬性"驹马,會(huì)造成遞歸
}
}
//類方法:類方法中革砸,不能使用對象屬性,只能使用類屬性
static func kanBing(){
print(age)
}
class func daZhen(){
print(age)
}
//構(gòu)造方法:不能使用類屬性
init(name:String,age:Int){
self.name = name
}
//對象方法
func shuYe(){
print("對象方法")
}
}
//繼承
class nurse:Docter{
//重寫父類方法糯累,一定要在方法前加override
override class func daZhen(){
print("我是子類算利,重寫了父類的class func daZhen()方法,用override修飾")
}
}
nurse.daZhen()
Swift中的協(xié)議
- 1.類寇蚊、結(jié)構(gòu)體笔时、枚舉都可以遵循協(xié)議,并提供具體實(shí)現(xiàn)來完成協(xié)議定義的方法和功能
- 2.任意能夠滿足協(xié)議要求的類型仗岸,被稱為遵循(conform)這個(gè)協(xié)議
- 3.使用“@objc”修飾的協(xié)議,其中的方法借笙,可以聲明成可選實(shí)現(xiàn)(用optional修飾)
//帶有可選實(shí)現(xiàn)函數(shù)的協(xié)議
@objc protocol Men{
func cook()//做飯
func wash()//洗衣服
optional func hitDouDou()//打豆豆
}
//必須全部實(shí)現(xiàn)函數(shù)的協(xié)議
protocol Divid{
func lookAfterKid()
}
//要遵循某個(gè)協(xié)議扒怖,如果類在遵循協(xié)議的同時(shí)擁有父類,應(yīng)該將父類名放在協(xié)議之前业稼,用逗號分隔盗痒,例如:
//聲明一個(gè)doc類,繼承于Docter低散,且遵守Men和Divid
class doc:Docter,Men,Divid {
//Men協(xié)議下的兩個(gè)方法(optional修飾的方法俯邓,可實(shí)現(xiàn),也可不實(shí)現(xiàn))
@objc func cook() {
print("做飯")
}
@objc func wash() {
print("洗衣服")
}
//Divid寫一下的一個(gè)方法熔号,必須實(shí)現(xiàn)
func lookAfterKid() {
print("照顧孩子")
}
}
let doc_1:doc = doc(name: "大衛(wèi)", age: 33)
doc_1.cook()
doc_1.wash()
doc_1.lookAfterKid()
Swift中的擴(kuò)展
擴(kuò)展(Extension)
- 1.extension + 類名或者結(jié)構(gòu)體名(可以對一個(gè)類或者結(jié)構(gòu)體擴(kuò)展方法)
- 2.extension可以多次對一個(gè)類進(jìn)行擴(kuò)展稽鞭,也可以一個(gè)類擴(kuò)展協(xié)議方法
- 3.擴(kuò)展就是向一個(gè)已有的類、結(jié)構(gòu)體引镊、枚舉添加新功能
- 4.擴(kuò)展可以對一個(gè)類型添加新功能朦蕴,但是不能重寫已有的功能
//1.對一個(gè)類進(jìn)行方法的擴(kuò)展(添加方法)
extension doc{
//擴(kuò)展一個(gè)對象方法
func say(){
print("I Love U")
}
//擴(kuò)展一個(gè)類方法
class func eat() {
print("I want to eat something")
}
}
doc_1.say()
doc.eat()//類方法用類名直接調(diào)用
//2.擴(kuò)展一個(gè) 類遵循的協(xié)議 中的方法
extension doc{
@objc func Magic(){
print("變魔術(shù)")
}
}
doc_1.Magic()
Swift中的閉包
- 1.閉包:是自包含的函數(shù)代碼塊,可以在代碼中被傳遞弟头、使用
- 2.swift中的閉包吩抓,和OC中的block以及其他語言中的匿名函數(shù)類似
- 3.閉包可以捕獲和存儲(chǔ)其所在上下文中任意的常量和變量(閉合并包裹著這些常量和變量)
- 4.swift會(huì)幫你管理在捕獲過程中涉及到的內(nèi)存操作
- 5.格式:
{(參數(shù)名:類型)->返回值類型 in
需要執(zhí)行的代碼
}
- 6.例如:
let backString = {(name:String)-> String in
return name
}
- 7.in:閉包的函數(shù)體部分由關(guān)鍵字in引入,該關(guān)鍵字表示閉包的參數(shù)和返回值類型定義已經(jīng)完成赴恨,閉包函數(shù)體即將開始
//求兩個(gè)數(shù)的最大值(三目運(yùn)算符)
//(a:Int,b:Int)->Int是maxResult的函數(shù)類型
var maxResult:((a:Int,b:Int)->Int)
//第一種方式
maxResult = {(a:Int,b:Int)->Int in
return a > b ? a : b
}
print(maxResult(a: 3, b: 5))
//第二種方式
maxResult = {
a,b in
return a > b ? a : b
}
print(maxResult(a: 3, b: 5))
//第三種方式
maxResult = {
a,b in
a > b ? a : b
}
print(maxResult(a: 3, b: 5))
//第四種方式
maxResult = {
(a,b)->Int in
return a > b ? a : b
}
print(maxResult(a: 3, b: 5))
//第五種方式
maxResult = {
$0 > $1 ? $0 : $1
}
print(maxResult(a: 3, b: 5))