柚子快報(bào)邀請(qǐng)碼778899分享:ios swift基礎(chǔ)學(xué)習(xí)筆記
?1、變量聲明
1.1 類型標(biāo)注
? ? ? ? 當(dāng)你聲明常量或者變量的時(shí)候可以加上類型標(biāo)注(type annotation),說明常量或者變量中要存儲(chǔ)的值的類型。如果要添加類型標(biāo)注,需要在常量或者變量名后面加上一個(gè)冒號(hào)和空格,然后加上類型名稱
變量 var 修飾 例如:var a:Int=10//聲明一個(gè)為Int類型的變量a并賦值為10
獲取 var b:String="hello 樹哥"http://聲明一個(gè)為String類型的變量b并賦值為" hello 樹哥 "
1.2 自動(dòng)類型推斷
? ? ? ? swift 可以自動(dòng)類型推斷 ,當(dāng)你要處理不同類型的值時(shí),類型檢查可以幫你避免錯(cuò)誤。然而,這并不是說你每次聲明常量和變量的時(shí)候都需要顯式指定類型。如果你沒有顯式指定類型,Swift 會(huì)使用類型推斷(type inference)來選擇合適的類型。
var a=10//自動(dòng)推斷為Int類型
var b="hello 樹哥"http://自動(dòng)推斷為String 類型
var varB = 3.14159// varB 會(huì)被推測(cè)為 Double 類型
1.3 類型安全
Swift 是一個(gè)類型安全(type safe)的語言。
由于 Swift 是類型安全的,所以它會(huì)在編譯你的代碼時(shí)進(jìn)行類型檢查(type checks),并把不匹配的類型標(biāo)記為錯(cuò)誤。這可以讓你在開發(fā)的時(shí)候盡早發(fā)現(xiàn)并修復(fù)錯(cuò)誤
var a=10
a="hello 樹哥"http://提示錯(cuò)誤:error: cannot assign value of type 'String' to type 'Int'
意思為不能將 'String' 字符串賦值給 'Int' 變量
1.4 可選類型
Swift 的可選(Optional)類型,用于處理值缺失的情況。可選表示"那兒有一個(gè)值,并且它等于 x "或者"那兒沒有值"。類似與kotlin dart語言 可空類型,例如:
var myString:String? = nil
說明myString的值可以賦值為nil 如 myString=nil,也可以賦值正常String 值 ,如 myString ="hello 樹哥"
1.4.1 強(qiáng)制解析
當(dāng)你確定可選類型確實(shí)包含值之后,你可以在可選的名字后面加一個(gè)感嘆號(hào)(!)來獲取值。這個(gè)感嘆號(hào)表示這個(gè)值一定不為空 這個(gè)和dart語言類似 跟kotlin的!!類似,比如:
var myString:String? = "hello 樹哥"
print(myString) //打印輸出: Optional("hello 樹哥")
加上!
var myString:String? = "hello 樹哥"
print(myString!) //打印輸出:hello 樹哥
1.4.2 自動(dòng)解析
在聲明可選變量時(shí)使用感嘆號(hào)(!)替換問號(hào)(?)。這樣可選變量在使用時(shí)就不需要再加一個(gè)感嘆號(hào)(!)來獲取值,它會(huì)自動(dòng)解析。
var myString:String!
myString = "hello 樹哥"
print(myString)//打印輸出:hello 樹哥
當(dāng)然如果變量在聲明時(shí)就已經(jīng)賦初始值的情況就可以直接使用了,例如:
var myString:String = "hello 樹哥"
print(myString)//打印輸出:hello 樹哥
1.4.3 可選綁定
使用 if let臨時(shí)常量 = 可選類型 來判斷可選類型是否包含值,如果包含就把值賦給臨時(shí)常量,否則(可選類型為nil時(shí))if語句判斷為假。
var optionalName: String? = "樹哥"
var greeting = "樹哥!"
if let name = optionalName {
greeting = "Hello, \(name)"
}
print(greeting)
如果optionalName的值不為空,則把optionalName的值賦值給name ,然后運(yùn)行? {
? ? greeting = "Hello, \(name)"
}的語句,比如以上例子 最后打印下greeting值,因?yàn)?greeting = "樹哥!"已賦值不為空,所以最后打印 Hello,樹哥!
如果optionalName的值是nil? ?條件會(huì)判斷為false 大括號(hào)里面的代碼會(huì)跳過;
1.4.4 類型別名
類型別名對(duì)當(dāng)前的類型定義了另一個(gè)名字,類型別名通過使用 typealias 關(guān)鍵字來定義。語法格式如下:
typealias newname = type
例如以下定義了 Int 的類型別名為 Feet:
typealias Feet = Int
現(xiàn)在,我們可以通過別名來定義變量:
typealias Feet = Int
var distance: Feet = 100
print(distance)
1.5 Swift 字符串?
1.5.1 字符串
你可以通過使用字符串字面量或 String 類的實(shí)例來創(chuàng)建一個(gè)字符串:
// 使用字符串字面量
var stringA = "Hello, World!"
print( stringA )
// String 實(shí)例化
var stringB = String("Hello, World!")
print( stringB )
// 使用字符串字面量創(chuàng)建空字符串
var stringA = ""
1.5.2 Swift 字符(Character)
let char1: Character = "A" //只能單個(gè)字符 多個(gè)會(huì)報(bào)錯(cuò)
例如:
// Swift 中以下賦值會(huì)報(bào)錯(cuò)
let char: Character = "AB"
//空字符變量
Swift 中不能創(chuàng)建空的 Character(字符) 類型變量或常量:
2、聲明常量
常量一旦設(shè)定,在程序運(yùn)行時(shí)就無法改變其值。
常量可以是任何的數(shù)據(jù)類型如:整型常量,浮點(diǎn)型常量,字符常量或字符串常量。同樣也有枚舉類型的常量:
常量類似于變量,區(qū)別在于常量的值一旦設(shè)定就不能改變,而變量的值可以隨意更改。
let a= 42
a=20//報(bào)錯(cuò) ,常量不可修改值
print(a)
其他都和變量一樣,比如類型推薦、類型標(biāo)注、類型別名等
3、運(yùn)算符
像算術(shù)運(yùn)算符(swift取消了++和--)、比較運(yùn)算符、邏輯運(yùn)算符和大多數(shù)編程語言一樣,區(qū)間運(yùn)算符 ... 這個(gè)比較獨(dú)特類似kotlin的
Swift 提供了兩個(gè)區(qū)間的運(yùn)算符。
運(yùn)算符 描述 實(shí)例 閉區(qū)間運(yùn)算符 閉區(qū)間運(yùn)算符(a...b)定義一個(gè)包含從a到b(包括a和b)的所有值的區(qū)間,b必須大于等于a。 ? 閉區(qū)間運(yùn)算符在迭代一個(gè)區(qū)間的所有值時(shí)是非常有用的,如在for-in循環(huán)中: 1...5 區(qū)間值為 1, 2, 3, 4 和 5 半開區(qū)間運(yùn)算符 半開區(qū)間(a..
比如
//閉區(qū)間運(yùn)算符:
for index in 1...5 {
print(index)
}
//打印 1,2,3,4,5
//半開區(qū)間運(yùn)算
for index in 1..<5 {
print(index)
}//打印 1,2,3,4
3.1 Swift 空格
Swift語言并不是像C/C++,Java那樣完全忽視空格,Swift對(duì)空格的使用有一定的要求
運(yùn)算符不能直接跟在變量或常量的后面。例如下面的代碼會(huì)報(bào)錯(cuò):
let a= 1 + 2 //a后面直接加上等號(hào)(=)
let a = 1+ 2//1后面直接添加 加號(hào)(+)
let a =1+ 2
let a=1+2
let a=1+ 2
let a =1+2//=后面直接跟上數(shù)值
只有這樣寫才不會(huì)報(bào)錯(cuò):
let a = 1 + 2; // 編碼規(guī)范推薦使用這種寫法
let b = 3+4 // 這樣也是OK的
4、條件語句
if語句和其他編程語言一樣 忽略
switch語句有點(diǎn)區(qū)別
Swift switch 語句中,默認(rèn)語法是必須要添加 default 語句。但也可以不加
注意:在大多數(shù)語言中,switch 語句塊中,case 要緊跟 break,否則 case 之后的語句會(huì)順序運(yùn)行,而在 Swift 語言中,默認(rèn)是不會(huì)執(zhí)行下去的,switch 也會(huì)終止(switch 不會(huì)從上一個(gè) case 分支落入到下一個(gè) case 分支中。只要第一個(gè)匹配到的 case 分支完成了它需要執(zhí)行的語句,整個(gè)switch代碼塊完成了它的執(zhí)行)。如果你想在 Swift 中讓 case 之后的語句會(huì)按順序繼續(xù)運(yùn)行,則需要使用 fallthrough 語句。
4.1 省略break
Swift Switch 語句中, break 是可以省略不寫的(添加了也可以),默認(rèn)執(zhí)行完當(dāng)前 case 下的內(nèi)容后,直接返回了,即使后續(xù)還有可滿足的條件。
var a=2
switch(a){
case 1:
print("hello 樹哥")
case 2:
print("hello 王哥")
case 2:
print("hello 寶哥")
case 4:
print("hello 強(qiáng)哥")
default:
print("hello 綠哥")
}
//打印hello 王哥
4.2 fallthrough
Swift fallthrough 語句讓 case 之后的語句會(huì)按順序繼續(xù)運(yùn)行,且不論條件是否滿足都會(huì)執(zhí)行。
var a=2
switch(a){
case 1:
print("hello 樹哥")
case 2:
print("hello 王哥")
fallthrough
case 3://這里改為3了
print("hello 寶哥")
case 4:
print("hello 強(qiáng)哥")
default:
print("hello 綠哥")
}
//hello 王哥
//hello 寶哥
5、Swift 數(shù)組
Swift 數(shù)組使用有序列表存儲(chǔ)同一類型的多個(gè)值。相同的值可以多次出現(xiàn)在一個(gè)數(shù)組的不同位置中。
Swift 數(shù)組會(huì)強(qiáng)制檢測(cè)元素的類型,如果類型不同則會(huì)報(bào)錯(cuò),Swift 數(shù)組應(yīng)該遵循像Array
如果創(chuàng)建一個(gè)數(shù)組,并賦值給一個(gè)變量,則創(chuàng)建的集合就是可以修改的。這意味著在創(chuàng)建數(shù)組后,可以通過添加、刪除、修改的方式改變數(shù)組里的項(xiàng)目。如果將一個(gè)數(shù)組賦值給常量,數(shù)組就不可更改,并且數(shù)組的大小和內(nèi)容都不可以修改。
5.1 創(chuàng)建數(shù)組
以下是創(chuàng)建一個(gè)初始化大小數(shù)組的語法:
var someArray = [SomeType](repeating: InitialValue, count: NumbeOfElements)
以下實(shí)例創(chuàng)建了一個(gè)類型為 Int ,數(shù)量為 3,初始值為 0 的空數(shù)組:
var someInts = [Int](repeating: 0, count: 3)
以下實(shí)例創(chuàng)建了含有三個(gè)元素的數(shù)組:
var someInts:[Int] = [10, 20, 30]
var someStrings:[String]=["hello","啊","樹哥"]
5.2 訪問數(shù)組
我們可以根據(jù)數(shù)組的索引來訪問數(shù)組的元素,語法如下:
var someVar = someArray[index]
index 索引從 0 開始,即索引 0 對(duì)應(yīng)第一個(gè)元素,索引 1 對(duì)應(yīng)第二個(gè)元素,以此類推。
var a:[Int] = [1,2,3,5]
print(a[0])//打印:1
5.3 遍歷數(shù)組
var a:[String]=["hello","啊","樹哥"]
for 循環(huán)
for i in a{
print(i)
}
forEach循環(huán)
a.forEach {
i in print(i)
}
?enumerate() 方法遍歷(需要每個(gè)數(shù)據(jù)項(xiàng)的值和索引值)
var a:[]=["hello","啊","樹哥"]
for (index, item) in a.enumerated() {
print("在 index = \(index) 位置上的值為 \(item)")
}
打印:
在 index = 0 位置上的值為 hello
在 index = 1 位置上的值為 啊
在 index = 2 位置上的值為 樹哥
5.4 修改數(shù)組
使用 append() 方法或者賦值運(yùn)算符 += 在數(shù)組末尾添加元素
var a:[String]=["hello","啊","樹哥"]
a.append("寶哥")
//或者 a+=["寶哥"]
print(a)
//打印: ["hello", "啊", "樹哥", "寶哥"]
也可以通過索引修改數(shù)組元素的值:
var a:[String]=["hello","啊","樹哥"]
a[1]="呀"http://修改數(shù)組第二個(gè)元素的值
print(a)
//打?。篬"hello", "呀", "樹哥"]
5.5 isEmpty 屬性
我們可以通過只讀屬性 isEmpty 來判斷數(shù)組是否為空,返回布爾值:
var a:[String]=["hello","啊","樹哥"]
print("a.isEmpty = \(a.isEmpty)") //輸出 a.isEmpty = false
6、 字典
Swift 字典用來存儲(chǔ)無序的相同類型數(shù)據(jù)的集合,Swift 字典會(huì)強(qiáng)制檢測(cè)元素的類型,如果類型不同則會(huì)報(bào)錯(cuò)。
Swift 字典每個(gè)值(value)都關(guān)聯(lián)唯一的鍵(key),鍵作為字典中的這個(gè)值數(shù)據(jù)的標(biāo)識(shí)符。
和數(shù)組中的數(shù)據(jù)項(xiàng)不同,字典中的數(shù)據(jù)項(xiàng)并沒有具體順序。我們?cè)谛枰ㄟ^標(biāo)識(shí)符(鍵)訪問數(shù)據(jù)的時(shí)候使用字典,這種方法很大程度上和我們?cè)诂F(xiàn)實(shí)世界中使用字典查字義的方法一樣。
Swift 字典的key沒有類型限制可以是整型或字符串,但必須是唯一的。
如果創(chuàng)建一個(gè)字典,并賦值給一個(gè)變量,則創(chuàng)建的字典就是可以修改的。這意味著在創(chuàng)建字典后,可以通過添加、刪除、修改的方式改變字典里的項(xiàng)目。如果將一個(gè)字典賦值給常量,字典就不可修改,并且字典的大小和內(nèi)容都不可以修改。
6.1 創(chuàng)建字典
var someDict = [KeyType: ValueType]()
以下是創(chuàng)建一個(gè)空字典,鍵的類型為 Int,值的類型為 String 的簡單語法:
var someDict = [Int: String]()
創(chuàng)建一個(gè)非空字典,同樣key為Int類型,value為String類型,例如 :
var someDict:[Int:String] = [1:"One", 2:"Two", 3:"Three"] ,
6.2 訪問字典
我們可以根據(jù)字典的索引來訪問數(shù)組的元素,語法如下:
var someVar = someDict[key]
例如
var someDict:[Int:String] = [1:"hello", 2:"a", 3:"樹哥"]
print(someDict[2]!)//打?。篴 (此處使用了強(qiáng)制解析!不然會(huì)打印Optional("a"))
6.3 修改字典
6.3.1 updateValue
我們可以使用?updateValue(forKey:)?增加或更新字典的內(nèi)容。如果 key 不存在,則添加值,如果存在則修改 key 對(duì)應(yīng)的值。updateValue(_:forKey:)方法返回Optional值。
var someDict:[Int:String] = [1:"hello", 2:"a", 3:"樹哥"]
print(someDict[2])
someDict.updateValue("呀",forKey:2)
print(someDict[2])
//打?。?/p>
Optional("a")
Optional("呀")
6.3.2 通過指定的 key 來修改
var someDict:[Int:String] = [1:"hello", 2:"a", 3:"樹哥"]
print(someDict[2])
someDict[2]="啊"
print(someDict[2])
//打?。?/p>
Optional("a")
Optional("啊")
6.4 移除 Key-Value 對(duì)
6.4.1 ?removeValueForKey()?
我們可以使用?removeValueForKey()?方法來移除字典 key-value 對(duì)。如果 key 存在該方法返回移除的值,如果不存在返回 nil?
var someDict:[Int:String] = [1:"hello", 2:"a", 3:"樹哥"]
someDict.removeValue(forKey: 2)
for x in someDict{
print(x)
}
//打?。?/p>
(3, "樹哥")
(1, "hello")
6.4.2 指定鍵的值為 nil?
通過指定鍵的值為 nil 來移除 key-value(鍵-值)對(duì)
var someDict:[Int:String] = [1:"hello", 2:"a", 3:"樹哥"]
someDict[2]=nil
for x in someDict{
print(x)
}
//打?。?/p>
(3, "樹哥")
(1, "hello")
6.5 字典遍歷
字典的遍歷和數(shù)組一樣 for循環(huán)、forEach或者enumerate()方法
var someDict:[Int:String] = [1:"hello", 2:"a", 3:"樹哥"]
for (key,value) in someDict{
print("key=\(key),value=\(value)")
}
for (key, value) in someDict.enumerated() {
print("字典 key \(key) - 字典 (key, value) 對(duì) \(value)")
}
someDict.forEach{
(key,value) in print("key=\(key),value=\(value)")
}
打印結(jié)果:
key=2,value=a
key=3,value=樹哥
key=1,value=hello
字典 key 0 - 字典 (key, value) 對(duì) (2, "a")
字典 key 1 - 字典 (key, value) 對(duì) (3, "樹哥")
字典 key 2 - 字典 (key, value) 對(duì) (1, "hello")
key=2,value=a
key=3,value=樹哥
key=1,value=hello
6.6 count 屬性
使用只讀的?count?屬性來計(jì)算字典有多少個(gè)鍵值對(duì):
var someDict:[Int:String] = [1:"hello", 2:"a", 3:"樹哥"]
print(someDict.count)//打?。?
7、元組
元組類型,用于在單個(gè)復(fù)合值中對(duì)多個(gè)值進(jìn)行分組
元組中的值可以是任何類型,并且不需要是相同類型
7.1 元組聲明
方式1:最簡單的元組,就是在圓括號(hào)中,用逗號(hào)分隔的一組值
var aTuple = (10, "TottiLV")
//也可以存放數(shù)組和字典
//例如
let arr = [1,2,3]
let dic = ["key1":"value1","key2":"value2","key3":"value3"]
let anyTuple = (arr, dic)
是一個(gè)具有兩個(gè)值的元組,一個(gè)元素是整數(shù)類型,另一個(gè)元素是字符串類型(這是一個(gè)合法的數(shù)據(jù))
方式2:可以在聲明時(shí)命名元組的變量,也可以使用它們的名稱來調(diào)用
let error404= (errorCode:404, description:"Not Found")
7.2 訪問元組
7.2.1 使用下標(biāo)取值
let error404 = (errorCode:401, description:"Not Found")
//取下標(biāo)為1處的值
print(error404.1)//打印:Not Found
7.2.2 使用元素名稱
let error404 = (errorCode:401, description:"Not Found")
print(error404.errorCode)//輸出:401
7.2.3 拆分成常量/變量
let error404 = (errorCode:401, description:"Not Found")
var (x,y)=error404
print(x)
print(y)
//打?。?/p>
401
Not Found
7.2.4 總結(jié)
元組優(yōu)點(diǎn):
?1、元組可以同時(shí)存儲(chǔ)多種類型元素,且元素類型固定,以保數(shù)據(jù)安全,除非你定義數(shù)據(jù)類型為Any。編譯器會(huì)對(duì)賦值參數(shù)類型進(jìn)行檢查
?2、元組的元素個(gè)數(shù)固定,不允許增加、刪除,編譯器會(huì)嚴(yán)格校驗(yàn)賦值參數(shù)個(gè)數(shù)
?3、無需定義key,但是必要時(shí)可以為數(shù)據(jù)命名,方便數(shù)據(jù)訪問
?4、適合同時(shí)遍歷多元數(shù)據(jù)
?元組缺點(diǎn):
?1、不適合存儲(chǔ)大量數(shù)據(jù),因?yàn)樵M不支持append、remove等方法
?2、考慮到工程實(shí)際情況,后段使用的語言可能不支持元組,需要轉(zhuǎn)換為其他格式
?元組適合應(yīng)用于組合少量的多元的數(shù)據(jù),與數(shù)組、字典結(jié)合使用可以產(chǎn)生強(qiáng)大威力
8、函數(shù)
8.1函數(shù)定義
Swift 定義函數(shù)使用關(guān)鍵字?func。
定義函數(shù)的時(shí)候,可以指定一個(gè)或多個(gè)輸入?yún)?shù)和一個(gè)返回值類型。
每個(gè)函數(shù)都有一個(gè)函數(shù)名來描述它的功能。通過函數(shù)名以及對(duì)應(yīng)類型的參數(shù)值來調(diào)用這個(gè)函數(shù)。函數(shù)的參數(shù)傳遞的順序必須與參數(shù)列表相同。
函數(shù)的實(shí)參傳遞的順序必須與形參列表相同,->?后定義函數(shù)的返回值類型。
語法
func funcname(形參) -> returntype
{
Statement1
Statement2
……
Statement N
return parameters
}
8.2 函數(shù)的創(chuàng)建
8.2.1 無參數(shù)、無返回值
func fun1(){
print("無參數(shù)、無返回值函數(shù)")
}
8.2.2 有參數(shù) 無返回值
func fun2(name:String){
print("有參數(shù)無返回值函數(shù) \(name)")
}
//調(diào)用
fun2(name:"hello")
8.2.3 無參數(shù) 有返回值
func fun3()->String{
return "hello"
}
8.2.4 有參數(shù) 有返回值
func fun4(name:String)->String{
return "hello " + "\(name)"
}
//調(diào)用fun2(name:"hello")
8.3 參數(shù)標(biāo)簽
8.3.1 參數(shù)名帶標(biāo)簽
swift 函數(shù)中 參數(shù)名可以帶標(biāo)簽
一般情況下我們聲明一個(gè)函數(shù),如下
func fun5(name:String){
print("hello \(name)")
}
調(diào)用:fun5(name:"樹哥")
然后使用參數(shù)標(biāo)簽的話,可以這樣寫
func fun6(xxx name:String){
print("hello \(name)")
}
調(diào)用: fun6(xxx :"樹哥)
8.3.2 忽略參數(shù)名
標(biāo)簽的作用就是提示 標(biāo)簽可以使用 _ 來代替,這樣調(diào)用函數(shù)的時(shí)候,直接傳值要傳的值就行了,例如:
func fun9(_ name:String){
print("hello \(name)")
}
fun9("樹哥")
8.4 函數(shù)參數(shù)默認(rèn)值
函數(shù)中默認(rèn)參數(shù)指的是賦了初始值的參數(shù),在調(diào)用函數(shù)的時(shí)候 默認(rèn)參數(shù)可傳也可不傳,類似kotlin和dart一樣
func fun10(msg:String,name:String="樹哥"){
print(msg+"\(name)")
}
fun10(msg:"hello")
fun10(msg:"hello",name:"大樹")
8.5 函數(shù)中的輸入輸出函數(shù)(inout)
一般默認(rèn)在函數(shù)中定義的參數(shù)都是常量參數(shù),也就是這個(gè)參數(shù)你只可以查詢使用,不能改變它的值。
如果想要聲明一個(gè)變量參數(shù),可以在參數(shù)定義前加 inout 關(guān)鍵字,這樣就可以改變這個(gè)參數(shù)的值了。例如:
func getName(_ name: inout String).........
此時(shí)這個(gè) name 值可以在函數(shù)中改變。
一般默認(rèn)的參數(shù)傳遞都是傳值調(diào)用的,而不是傳引用。所以傳入的參數(shù)在函數(shù)內(nèi)改變,并不影響原來的那個(gè)參數(shù)。傳入的只是這個(gè)參數(shù)的副本。
當(dāng)傳入的參數(shù)作為輸入輸出參數(shù)時(shí),需要在參數(shù)名前加 & 符,表示這個(gè)值可以被函數(shù)修改。
func swapValues(_ v1: inout Int, _ v2: inout Int) {
let tmp = v1
v1 = v2
v2 = tmp
}
var num1 = 10
var num2 = 20
swapValues(&num1, &num2)
print(num1)//打印輸出:20
print(num2)//打印輸出:10
8.6 函數(shù)重載
規(guī)則
1、函數(shù)名相同
2、參數(shù)個(gè)數(shù)不同 || 參數(shù)類型不同 || 參數(shù)標(biāo)簽不同
9、 閉包
10、結(jié)構(gòu)體
11、類
12、拓展
柚子快報(bào)邀請(qǐng)碼778899分享:ios swift基礎(chǔ)學(xué)習(xí)筆記
相關(guān)文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。