Swift 淺談

空合并運(yùn)算符
var count:Int? = 10
var value:Int

/// 空合并運(yùn)算符   第一個(gè)操作數(shù)必須為optional 如果不為nil責(zé)將進(jìn)行拆包操作
print(count ?? 0)  和 三目運(yùn)算符 print(count != nil ? count! : 0) 結(jié)果一樣

結(jié)果為:10
元祖
/// 定義元祖
var student:(String,Int,Float) = ("kakaxi",20,185.0)
/// var stu:(name:String,age:Int,height:Float) = ("kakaxi",20,185.0)

print(student.0)
/// 將元祖進(jìn)行分解   分解命名時(shí)使用_忽略命名字段
var (name,_,_) = student

print(name)

結(jié)果為:kakaxi
數(shù)組
聲明一個(gè)十個(gè)元素相同的數(shù)組
var array = [String](repeating: "helllo world", count: 10)
var arrList = [0,1,2,3,4]

遍歷數(shù)組的不同方式
for item in arrList {
    print(item)
}
0
1
2
3
4

for item in arrList.enumerated() {
    print(item)
}
(offset: 0, element: 0)
(offset: 1, element: 1)
(offset: 2, element: 2)
(offset: 3, element: 3)
(offset: 4, element: 4)

for index in arrList.indices {
    print(arrList[index], separator:"")
}

0
1
2
3
4
字典
var dicts:Dictionary<Int,String>
dicts = [1:"1",2:"2"]
print(dicts)

結(jié)果為:[2: "2", 1: "1"]
Set
集合(Set)

集合(Set)特點(diǎn):無(wú)序、唯一性芬萍、集合操作买喧、快速查找。
集合的數(shù)據(jù)顯示和數(shù)組是一樣的憔杨,所以必須顯示的聲明Set集合鸟赫!不然!就是數(shù)組消别!
// 初始化A抛蚤、B、C三個(gè)集合
var A:Set<String> = ["A", "B", "C", "D"]
var B:Set<String> = ["C", "D", "E", "F"]
var C:Set<String> = ["B", "B", "C"]

// 上面Array寻狂、Dictionary動(dòng)態(tài)初始化有四種岁经,這里面只有兩種
var set1 = Set<String>()
var set2:Set<String> = []

// 集合的數(shù)量
A.count
// 集合第一個(gè)元素,因?yàn)榧系臒o(wú)序性蛇券,它的第一個(gè)元素沒(méi)有意義
A.first
// 集合是否為空
A.isEmpty
// 向集合中插入一個(gè)元素
A.insert("C")
// 刪除集合中的元素
A.remove("C")
// 判斷集合中是否包含某個(gè)元素
A.contains("A")
// 遍歷集合
for index in A {
    index
}
運(yùn)算符
///通過(guò)~=運(yùn)算符來(lái)檢查某個(gè)數(shù)字是否包含在范圍中
var range = 0...10
print(range~=8)   true
while和repeat-while 條件循環(huán)結(jié)構(gòu)
當(dāng) i 大于等于10的時(shí)候跳出循環(huán)   
var i = 0
while i < 10 {
    print("while",i)
    i += 1
}
repeat while 循環(huán)
先執(zhí)行循環(huán)體缀壤,在進(jìn)行條件判斷  和 OC 中的 do - while功能基本一致
var j = 0
repeat{
    print("while",j)
    j+=1
}while j < 10
流程跳轉(zhuǎn)語(yǔ)句
swift中提供的流程跳轉(zhuǎn)語(yǔ)句主要有:continue、break纠亚、fallthrough塘慕、return、throw蒂胞、guard

continue: 語(yǔ)句用于循環(huán)結(jié)構(gòu)中图呢,作用為跳過(guò)本次循環(huán),直接開始下次循環(huán)
break:中斷語(yǔ)句啤誊,也可以用于循環(huán)結(jié)構(gòu)中岳瞭,和continue語(yǔ)句不同,break語(yǔ)句會(huì)直接中斷包含它的循環(huán)結(jié)構(gòu)
fallthrough:語(yǔ)句是swift中特有的一種流程控制語(yǔ)句蚊锹,可以再中斷語(yǔ)句中繼續(xù)執(zhí)行下面的語(yǔ)句

例如:
var i = 3
switch i {
case 1...3:
print("switch")
    fallthrough
default:
    print("default")
}
結(jié)果為:switch   default
如果不加fallthrough 結(jié)果為:switch

return: 用于返回結(jié)果值瞳筏,或者用于提前結(jié)束無(wú)返回值類型的函數(shù)

throw: 語(yǔ)句用于拋出異常,拋出的異常如果不進(jìn)行捕捉處理牡昆,也會(huì)使程序中斷

guard - else: 是Swift2.0之后新加入的一種語(yǔ)法結(jié)構(gòu)姚炕,Swift團(tuán)隊(duì)創(chuàng)造它的目的在于是代碼結(jié)構(gòu)和邏輯更加清晰

func normalFunc(param:Int){
    if param <= 0 {
        return
    }
    print(param)
}

func fuardFunc(param:Int){
    guard param > 0 else {
        return
    }
    print(param)
}

聲明函數(shù)
有參數(shù)有返回值
func compare(param1:Int,param2:Int)->Int {
    return param1 + param2
}

var add = compare(param1: 10, param2: 20)
print(add)   30

func search(searchID:Int)->(success:Bool,data:String){
    let reust = true
    let data = "數(shù)據(jù)實(shí)體"
    return(reust,data)
}

if search(searchID: 1000).success {
    print(search(searchID: 1000).data)   數(shù)據(jù)實(shí)體
}

函數(shù)的參數(shù)可以傳也可以不傳(設(shè)置默認(rèn)值)
func myFunc(param1:Int,param2:Int = 10)->Int {
    return param1 + param2
}

print(myFunc(param1: 8))   18
print(myFunc(param1: 10, param2: 40))    50

函數(shù)可以多參數(shù),也可以多個(gè)不確定參數(shù)
在參數(shù)后面添加...   
func funcParams(param:Int...)->Int{
    var sum = 0
    for count in param {
        sum+=count
    }
    return sum
}
print(funcParams(param: 10,20,30,40,50))   150

聲明一個(gè)函數(shù)變量
var addFunc:(Int...)->Int
addFunc = funcParams
print(addFunc(100,200))   300

函數(shù)重載    相同方法名   參數(shù)返回值不同
func addFunc(param1:Int,param2:Int)->Int{
    return param1 + param2
}
func addFunc(param1:Double,param2:Double)->Double{
    return param1 + param2
}
func addFunc(param1:String,param2:String)->String{
    return param1 + param2
}
閉包
閉包標(biāo)準(zhǔn)結(jié)構(gòu):
{(參數(shù)列表)-> 返回值 in 閉包體}
首先閉包最外層由大括號(hào)包圍丢烘,內(nèi)部由閉包關(guān)鍵字in來(lái)進(jìn)行分割柱宦,關(guān)鍵字in前面為閉包結(jié)構(gòu)的參數(shù)列表和返回值,其書寫規(guī)則與函數(shù)一致播瞳,in關(guān)鍵字后面為閉包體掸刊,用于實(shí)現(xiàn)具體功能

let closures = {(param:Int)->Int in
    return param * param
}
自定義運(yùn)算符
prefix operator ++
prefix func ++(param:Int)->Int
{
    return param + 1
}
枚舉
enum Season {
    case spring
    case summer
    case autumn
    case winter
}
let season = Season.spring

func switchFunc(){
    switch season {
    case .spring:
        print("spring")
    case .summer:
        print("summer")
    case .autumn:
        print("autumn")
    default:
        print("winter")
    }
}

switchFunc()   spring
結(jié)構(gòu)體
swift 既可以聲明屬性也可以定義方法

struct Car {
    var price:Int
    var brand:String
    var petrol:Int
    mutating func Drive(){
        if petrol > 0 {
            print("driving")
        }else{
            print("drived")
        }
    }
}

var car = Car(price: 100000, brand: "寶馬", petrol: 10)
car.Drive()   //  driving
在創(chuàng)建類時(shí),使用final關(guān)鍵字  其類不可以被繼承  
使用final聲明屬性時(shí)赢乓,其屬性不可以被子類使用
指定構(gòu)造方法與遍歷構(gòu)造方法
對(duì)于類來(lái)說(shuō)忧侧,構(gòu)造方法有指定構(gòu)造方法和便利構(gòu)造方法之分石窑。 指定構(gòu)造方法的官方名稱為Designated,遍歷構(gòu)造方法為Convenience。
 指定構(gòu)造方法不需要任何關(guān)鍵字修飾蚓炬,便利構(gòu)造方法需要使用Convenience關(guān)鍵字來(lái)修飾松逊。
關(guān)于指定構(gòu)造方法和便利構(gòu)造方法,Swift語(yǔ)言中有這樣的規(guī)定:
1.  子類的指定構(gòu)造方法中必須調(diào)用父類的指定構(gòu)造方法肯夏。
2.  遍歷構(gòu)造方法中必須調(diào)用當(dāng)前類的其他構(gòu)造方法经宏。
3.  遍歷構(gòu)造方法歸根結(jié)底要調(diào)用到某個(gè)指定構(gòu)造方法。

// 創(chuàng)建一個(gè)類作為基類
class BaseClass {
    // 提供一個(gè)指定構(gòu)造方法
    init() {
        print("baseClass Designted")
    }
    
    // 提供一個(gè)便利構(gòu)造方法
    // 便利構(gòu)造方法必須調(diào)用當(dāng)前類中的其他構(gòu)造方法驯击,并最終調(diào)用到指定構(gòu)造方法
    convenience init(param:String) {
        print("BaseClass Convenience")
        /// 進(jìn)行指定構(gòu)造方法的調(diào)用
        self.init()
    }
    
}

/// 創(chuàng)建一個(gè)BaseClass的子類
class SubClass: BaseClass {
    // 覆寫指定構(gòu)造方法中必須調(diào)用父類的指定構(gòu)造方法
    override init() {
        super.init()
    }
    
    // 提供兩個(gè)便利構(gòu)造方法
    convenience init(param:String) {
        // 最終調(diào)用到某個(gè)指定構(gòu)造方法
        self.init()
    }
    
    convenience init(param:Int) {
        // 調(diào)用一個(gè)便利構(gòu)造方法
        self.init(param: "Swift")
        
    }
}

var obj = SubClass()
print(obj)     // baseClass Designted   conditation.SubClass
引用計(jì)數(shù)
Swift中語(yǔ)言中的數(shù)據(jù)傳遞分為兩種烁兰,即值類型的數(shù)據(jù)傳遞和引用類型的數(shù)據(jù)傳遞

對(duì)于值類型的數(shù)據(jù)傳遞,其采用的是完全復(fù)制的原理余耽,因此原數(shù)據(jù)的銷毀與內(nèi)存的釋放并不會(huì)影響新數(shù)據(jù)缚柏,
新數(shù)據(jù)占用的內(nèi)存會(huì)在它本身作用域結(jié)束時(shí)釋放。

if true {
    var a = 0
    if true {
        var b = 1
        a = b
    }
    // 此時(shí)變量b所占內(nèi)存被釋放
}
// 此處變量a所占內(nèi)存被釋放

引用數(shù)據(jù)類型的數(shù)據(jù)傳遞就復(fù)雜一些碟贾,我們知道引用類型的數(shù)據(jù)傳遞并不會(huì)完全復(fù)制原數(shù)據(jù)币喧,
而是通過(guò)要引用的方式對(duì)原數(shù)據(jù)進(jìn)行訪問(wèn),因此無(wú)論一個(gè)類實(shí)例被多少個(gè)變量所承載袱耽,其真正所訪問(wèn)的內(nèi)存都是同一個(gè)地方杀餐。
if true {
    var a = TestClass()
    if true {
        var b = a
    }
    // 此處變量b已經(jīng)不存在,但是TestClass實(shí)例依然占用內(nèi)存, 沒(méi)有釋放
}
// 此處變量a已經(jīng)不存在朱巨,也沒(méi)有其他變量引用TestClass實(shí)例史翘,該實(shí)例將調(diào)用deinit方法,其所占內(nèi)存被釋放
循環(huán)引用及其解決方法
循環(huán)引用一直是初級(jí)開發(fā)者編程的噩夢(mèng)冀续。對(duì)類實(shí)例進(jìn)行不當(dāng)?shù)囊脮?huì)造成內(nèi)存泄露琼讽,內(nèi)存泄露積累到一定程度就會(huì)給應(yīng)用程序帶來(lái)災(zāi)難性的后果。

class ClassOne{
    deinit {
        print("ClassOne deinit")
    }
}

class ClassTwo{
    /// ClassTwo 類中有一個(gè)ClassOne類的屬性
    var classOne:ClassOne?
    init(classOne:ClassOne?) {
        self.classOne = classOne
    }
    deinit {  /// 析構(gòu)方法  相當(dāng)于OC中的dealloc
        print("ClassTwo deinit")
    }
}

var classOne:ClassOne? = ClassOne()
var classTwo:ClassTwo? = ClassTwo(classOne: classOne)
/// 此時(shí)ClassTwo類中的classOne屬性依然在引用classOne實(shí)例洪唐,因此classOne實(shí)例所占內(nèi)存沒(méi)有釋放
classOne = nil
/// 此時(shí)classTwo 被釋放钻蹬,classTwo中的屬性也都被釋放,不在有誰(shuí)引用classOne凭需,classOne實(shí)例也被釋放
classTwo = nil

結(jié)果為:
   ClassTwo deinit
   ClassOne deinit   

**上述代碼十分健康问欠,兩個(gè)類都被釋放**


class ClassOne{
    var cls:ClassTwo?
    deinit {
        print("ClassOne deinit")
    }
}

class ClassTwo{
    /// ClassTwo 類中有一個(gè)ClassOne類的屬性
    var cls:ClassOne?
    init(cls:ClassOne?) {
        self.cls = cls
    }
    deinit {
        print("ClassTwo deinit")
    }
}

var classOne:ClassOne? = ClassOne()
var classTwo:ClassTwo? = ClassTwo(cls: classOne)
classOne?.cls = classTwo

classTwo = nil
classOne = nil

**上述兩個(gè)類都沒(méi)有被釋放,代碼中已將將classOne和classTwo都置為nil粒蜈,但其所占據(jù)的內(nèi)存將無(wú)法釋放顺献,這便是循環(huán)引用最常見(jiàn)的場(chǎng)景**

Swift 語(yǔ)言中提供了弱引用關(guān)鍵字(weak)來(lái)處理這樣的問(wèn)題;weak 關(guān)鍵字的作用是在使用這個(gè)實(shí)例的時(shí)候并不保有次實(shí)例的引用
(普通的引用類型數(shù)據(jù)在傳遞時(shí)會(huì)使實(shí)例的引用計(jì)數(shù)加1枯怖,使用weak關(guān)鍵字修飾的引用類型數(shù)據(jù)在傳遞時(shí)不會(huì)使引用計(jì)數(shù)加1)

將ClassOne中的屬性 使用weak 聲明:
  weak var cls:ClassTwo?
結(jié)果為:
     ClassTwo deinit
     ClassOne deinit   

擴(kuò)展:
**
弱引用還有一個(gè)特點(diǎn)注整,其職能修飾Optional類型的屬性,被弱引用的實(shí)例釋放后,這個(gè)屬性會(huì)被自動(dòng)設(shè)置為nil肿轨,那么問(wèn)題來(lái)了借浊,如果開發(fā)中使用到的屬性是非Optional值類型的,又恰巧出現(xiàn)了循環(huán)引用的場(chǎng)景萝招,開發(fā)者該如何處理呢?其實(shí)Swift語(yǔ)言中還提供了一個(gè)關(guān)鍵字(unowned 無(wú)主引用)來(lái)處理非Optional值類型屬性的循環(huán)引用問(wèn)題存捺。
**
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末槐沼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子捌治,更是在濱河造成了極大的恐慌岗钩,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肖油,死亡現(xiàn)場(chǎng)離奇詭異兼吓,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)森枪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門视搏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人县袱,你說(shuō)我怎么就攤上這事浑娜。” “怎么了式散?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵筋遭,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我暴拄,道長(zhǎng)漓滔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任乖篷,我火速辦了婚禮响驴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘那伐。我一直安慰自己踏施,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布罕邀。 她就那樣靜靜地躺著畅形,像睡著了一般。 火紅的嫁衣襯著肌膚如雪诉探。 梳的紋絲不亂的頭發(fā)上日熬,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音肾胯,去河邊找鬼竖席。 笑死耘纱,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的毕荐。 我是一名探鬼主播束析,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼憎亚!你這毒婦竟也來(lái)了员寇?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤第美,失蹤者是張志新(化名)和其女友劉穎蝶锋,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體什往,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡扳缕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了别威。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片躯舔。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖省古,靈堂內(nèi)的尸體忽然破棺而出庸毫,到底是詐尸還是另有隱情,我是刑警寧澤衫樊,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布飒赃,位于F島的核電站,受9級(jí)特大地震影響科侈,放射性物質(zhì)發(fā)生泄漏载佳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一臀栈、第九天 我趴在偏房一處隱蔽的房頂上張望蔫慧。 院中可真熱鬧,春花似錦权薯、人聲如沸姑躲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)黍析。三九已至,卻和暖如春屎开,著一層夾襖步出監(jiān)牢的瞬間阐枣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蔼两,地道東北人甩鳄。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像额划,于是被迫代替她去往敵國(guó)和親妙啃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容