Swift學(xué)習(xí)之旅

基本語(yǔ)法

  • 不要求每一行結(jié)束都有分號(hào)
  • 運(yùn)算符不能直接跟在變量或常量后面
  • 可自動(dòng)識(shí)別屬性類(lèi)別
  • 可選屬性聲明后沒(méi)有提供初始值,那么默認(rèn)值是nil
  • 使用操作符!去獲取值為nil的可選變量會(huì)有運(yùn)行時(shí)錯(cuò)誤
    而可選類(lèi)型對(duì)所有的類(lèi)型都可用,并且更安全

Swift和Objective-C對(duì)比,新出現(xiàn)關(guān)鍵字

deinit
extension
inout
internal
operator
subscript
typealias

類(lèi)型別名

typealias Feet = Int
var distance:Feet = 13

類(lèi)型安全,在編譯期間就進(jìn)行類(lèi)型檢查

變量和常量定義

var 表示是變量,可以修改指針指向
let 表示是常量。

0b 二進(jìn)制
0o八進(jìn)制
0x十六進(jìn)制

var age : Int?
表示age變量默認(rèn)值是nil

switch

  • 這里我們需要注意 case 語(yǔ)句中如果沒(méi)有使用 fallthrough 語(yǔ)句,則在執(zhí)行當(dāng)前的 case 語(yǔ)句后,switch 會(huì)終止,控制流將跳轉(zhuǎn)到 switch 語(yǔ)句后的下一行。
    如果使用了fallthrough 語(yǔ)句,則會(huì)繼續(xù)執(zhí)行之后的 case 或 default 語(yǔ)句,不論條件是否滿(mǎn)足都會(huì)執(zhí)行。

字符串

var test = String("Hello world")
if test.isEmpty { //todo } 判斷字符串是否為空

let stringA = String("haha")
stringA += "wawa" // 編譯出錯(cuò),let標(biāo)識(shí)常量,不能修改
  • 字符串長(zhǎng)度使用 String.characters.count 屬性來(lái)計(jì)算
  • Int(String),轉(zhuǎn)換字符串?dāng)?shù)字為整型

字符Character

  • let char: Character = "AB" // 會(huì)報(bào)錯(cuò)
  • let char1: Character = "" // 同樣報(bào)錯(cuò)

數(shù)組

  • Array
    用var 修飾的數(shù)組時(shí)可變數(shù)組,反之用let聲明的則是不可變數(shù)組。
var mutableArray : Array<String> = ["xixi", "haha", "hoho"];
var mutableArray1 : [String] = ["xixi", "haha", "hoho"];
var emptyArray = [String]();
let unMutableArray = Array<String> = ["xixi", "haha", "hoho"];
  • 初始化數(shù)組
    var someInts = [Int](repeating: 0, count: 3)
    var someInts[Int] = [1,2,3]
  • 添加元素,append或+=
  • 遍歷
for (index, item) in someStrs.enumerated() {
    print("在 index = \(index) 位置上的值為 \(item)")
}
  • 合并 +
  • 數(shù)組個(gè)數(shù) count

元組

  • 返回一個(gè)元組類(lèi)型 func minMax(array:[Int])->(min:Int,max:Int)
  • 可選元組類(lèi)型如(Int, Int)?與元組包含可選類(lèi)型如(Int?, Int?)是不同的.可選的元組類(lèi)型,整個(gè)元組是可選的,而不只是元組中的每個(gè)元素值。

字典

  • 定義
var someDict:[String:Int] = ["A":1,"B":2]
var someDict = [String:Int]()
  • 更新 someDict.updateValue(3, forKey: "A")
  • 刪除 someDict.removeValue(forKey: 2)

函數(shù)

  • 如果為函數(shù)的參數(shù)指定默認(rèn)值,則在調(diào)用函數(shù)時(shí)可以不傳對(duì)應(yīng)的參數(shù)
func makeCoffee(type : String = "卡布奇諾") {
    print(type);
}

makeCoffee() // 打印結(jié)果 卡布奇諾
makeCoffee(type: "拿鐵") // 打印結(jié)果 拿鐵
  • 內(nèi)部參數(shù)
    func test(name:String, age:Int)->String {}
  • 外部參數(shù),如果你提供了外部參數(shù)名,那么函數(shù)在被調(diào)用時(shí),必須使用外部參數(shù)名
    func test(myName name:String,myAge age:Int)->String {}
  • inout 參數(shù)標(biāo)識(shí) 和 c的指針一樣
func swap(_ a:inout Int, _ b:inout Int) { }
var x = 1; var y = 5
swap(&x, &y) 
  • 函數(shù)類(lèi)型(什么?!這是js嗎)
func add(a:Int, b:Int)->Int {
    return a + b
}
var addition:((Int, Int)->Int) = add
print(addition(1,2))

類(lèi)

Swift 中的類(lèi)并不是從一個(gè)通用的基類(lèi)繼承而來(lái)。如果你不為你定義的類(lèi)指定一個(gè)超類(lèi)的話(huà),這個(gè)類(lèi)就自動(dòng)成為基類(lèi)。

可選鏈

可以通過(guò)連接多個(gè)可選鏈?zhǔn)秸{(diào)用在更深的模型層級(jí)中訪(fǎng)問(wèn)屬性、方法以及下標(biāo)。然而,多層可選鏈?zhǔn)秸{(diào)用不會(huì)增加返回值的可選層級(jí)。

如果你訪(fǎng)問(wèn)的值不是可選的,可選鏈?zhǔn)秸{(diào)用將會(huì)返回可選值。
如果你訪(fǎng)問(wèn)的值就是可選的,可選鏈?zhǔn)秸{(diào)用不會(huì)讓可選返回值變得“更可選”。
因此:

通過(guò)可選鏈?zhǔn)秸{(diào)用訪(fǎng)問(wèn)一個(gè)Int值,將會(huì)返回Int?,無(wú)論使用了多少層可選鏈?zhǔn)秸{(diào)用。
類(lèi)似的,通過(guò)可選鏈?zhǔn)秸{(diào)用訪(fǎng)問(wèn)Int?值,依舊會(huì)返回Int?值,并不會(huì)返回Int??。

擴(kuò)展

添加計(jì)算型屬性和計(jì)算型類(lèi)型屬性
定義實(shí)例方法和類(lèi)型方法
提供新的構(gòu)造器
定義下標(biāo)
定義和使用新的嵌套類(lèi)型
使一個(gè)已有類(lèi)型符合某個(gè)協(xié)議

可選的協(xié)議要求

協(xié)議可以定義可選要求,遵循協(xié)議的類(lèi)型可以選擇是否實(shí)現(xiàn)這些要求。在協(xié)議中使用 optional 關(guān)鍵字作為前綴來(lái)定義可選要求??蛇x要求用在你需要和 Objective-C 打交道的代碼中。協(xié)議和可選要求都必須帶上@objc屬性。標(biāo)記 @objc 特性的協(xié)議只能被繼承自 Objective-C 類(lèi)的類(lèi)或者 @objc 類(lèi)遵循,其他類(lèi)以及結(jié)構(gòu)體和枚舉均不能遵循這種協(xié)議。

使用可選要求時(shí)(例如,可選的方法或者屬性),它們的類(lèi)型會(huì)自動(dòng)變成可選的。比如,一個(gè)類(lèi)型為 (Int) -> String 的方法會(huì)變成 ((Int) -> String)?。需要注意的是整個(gè)函數(shù)類(lèi)型是可選的,而不是函數(shù)的返回值。

協(xié)議中的可選要求可通過(guò)可選鏈?zhǔn)秸{(diào)用來(lái)使用,因?yàn)樽裱瓍f(xié)議的類(lèi)型可能沒(méi)有實(shí)現(xiàn)這些可選要求。類(lèi)似 someOptionalMethod?(someArgument) 這樣,你可以在可選方法名稱(chēng)后加上 ? 來(lái)調(diào)用可選方法。詳細(xì)內(nèi)容可在可選鏈?zhǔn)秸{(diào)用章節(jié)中查看。

下面的例子定義了一個(gè)名為 Counter 的用于整數(shù)計(jì)數(shù)的類(lèi),它使用外部的數(shù)據(jù)源來(lái)提供每次的增量。數(shù)據(jù)源由 CounterDataSource 協(xié)議定義,包含兩個(gè)可選要求:

@objc protocol CounterDataSource {
    @objc optional func incrementForCount(count: Int) -> Int
    @objc optional var fixedIncrement: Int { get }
}

訪(fǎng)問(wèn)控制

模塊和源文件

  • 在 Swift 中,Xcode 的每個(gè) target(例如框架或應(yīng)用程序)都被當(dāng)作獨(dú)立的模塊處理。如果你是為了實(shí)現(xiàn)某個(gè)通用的功能,或者是為了封裝一些常用方法而將代碼打包成獨(dú)立的框架,這個(gè)框架就是 Swift 中的一個(gè)模塊。當(dāng)它被導(dǎo)入到某個(gè)應(yīng)用程序或者其他框架時(shí),框架內(nèi)容都將屬于這個(gè)獨(dú)立的模塊。
  • 源文件就是 Swift 中的源代碼文件,它通常屬于一個(gè)模塊,即一個(gè)應(yīng)用程序或者框架。盡管我們一般會(huì)將不同的類(lèi)型分別定義在不同的源文件中,但是同一個(gè)源文件也可以包含多個(gè)類(lèi)型、函數(shù)之類(lèi)的定義。
  • 一個(gè) public 類(lèi)型的所有成員的訪(fǎng)問(wèn)級(jí)別默認(rèn)為 internal 級(jí)別,而不是 public 級(jí)別。如果你想將某個(gè)成員指定為 public 級(jí)別,那么你必須顯式指定。這樣做的好處是,在你定義公共接口的時(shí)候,可以明確地選擇哪些接口是需要公開(kāi)的,哪些是內(nèi)部使用的,避免不小心將內(nèi)部使用的接口公開(kāi)。
  • 我們甚至可以在子類(lèi)中,用子類(lèi)成員去訪(fǎng)問(wèn)訪(fǎng)問(wèn)級(jí)別更低的父類(lèi)成員,只要這一操作在相應(yīng)訪(fǎng)問(wèn)級(jí)別的限制范圍內(nèi)(也就是說(shuō),在同一源文件中訪(fǎng)問(wèn)父類(lèi) private 級(jí)別的成員,在同一模塊內(nèi)訪(fǎng)問(wèn)父類(lèi) internal 級(jí)別的成員)

自定義運(yùn)算符

當(dāng)使用自定義運(yùn)算時(shí), 傳入的參數(shù)至少要有一個(gè)當(dāng)前對(duì)象, 否則編譯不會(huì)通過(guò)。定義前綴或后綴運(yùn)算符時(shí),不要指定優(yōu)先級(jí)。但是,如果將前綴和后綴運(yùn)算符應(yīng)用于相同的操作時(shí),則首先進(jìn)行后綴運(yùn)算。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容