从0开始学Swift笔记整理(一)
Swift 是一種適用于 iOS 和 OS X 應(yīng)用的全新編程語言,它建立在最好的 C 和 Objective-C 語言之上,并且沒有 C 語言的兼容性限制。Swift 采用安全的編程模式,增加了現(xiàn)代功能使 編程更容易、更靈活、更有趣。Swift 以成熟且備受寵愛的 Cocoa 和 Cocoa Touch 框架為 支撐,這是一個重新構(gòu)想軟件開發(fā)的機(jī)會。?
——我的第一行Swift代碼
import Foundation???????????? //表示引入Foundation框架
var str = "Hello World"????//聲明str變量,var表示聲明變量
print(str)????? //print(_:)是一個函數(shù),能夠?qū)⒆兞炕虺A枯敵龅娇刂婆_
——使用Web網(wǎng)站編寫Swift代碼
Swift程序不能在Windows其他平臺編譯和運(yùn)行,有人提供了一個網(wǎng)站swiftstub.com,可以在任何平臺下編譯和運(yùn)行Swift程序。
——Swift 2.0之后增加的關(guān)鍵字
在Swift 2.0之后增加defer、guard、repeat、catch、rethrows、throw、throws和try關(guān)鍵字,其中repeat關(guān)鍵字替代do - while循環(huán)中的do,即中repeat - while循環(huán)。而do關(guān)鍵字用于錯誤處理。catch、rethrows、throw、throws和try是錯誤處理關(guān)鍵字。?? ? 錯誤處理是Swift 2.0之后增加新內(nèi)容。
——用Playground工具編寫Swift
用Playground編寫Swift代碼目的是為了學(xué)習(xí)、測試算法、驗證想法和可視化看到運(yùn)行結(jié)果,不是為了使最終的程序編譯和發(fā)布。
Playground程序運(yùn)行 ①區(qū)域是代碼編寫視圖;②區(qū)域是運(yùn)行結(jié)果視圖;③區(qū)域是時間軸視圖;④區(qū)域是控制臺視圖,使用print等日志函數(shù)將結(jié)果輸出到控制臺,可以通過左下角的 按鈕隱藏和顯示控制臺。
——Swift標(biāo)識符和關(guān)鍵字
標(biāo)識符就是給變量、常量、方法、函數(shù)、枚舉、結(jié)構(gòu)體、類、協(xié)議等由開發(fā)人員指定的名字。
Swift中命名規(guī)則:
·區(qū)分大小寫,Myname與myname是兩個不同的標(biāo)識符;
·標(biāo)識符首字符可以以下劃線(_)或者字母開始,但不能是數(shù)字;
·標(biāo)識符中其他字符可以是下劃線(_)、字母或數(shù)字。
Swift語言常見的關(guān)鍵字有以下4種
·與聲明有關(guān)的關(guān)鍵字:class、deinit、enum等。
·與語句有關(guān)的關(guān)鍵字:break、case、continue等。
·表達(dá)式和類型關(guān)鍵字:as、catch、dynamicType、false等。
·在特定上下文中使用的關(guān)鍵字:associativity、convenience、dynamic等。
注意:Swift中關(guān)鍵字是區(qū)分大小寫的,所以class和Class是不同的,那么Class不是Swift的關(guān)鍵字。
——常量和變量
在Swift中,用let聲明一個常量;用var來聲明一個變量
我覺得:原則上優(yōu)先使用let,它有很多好處,可以防止程序運(yùn)行過程中不必要的修改、提高程序的可讀性。特別是引用數(shù)據(jù)類型聲明時候經(jīng)常采用let聲明,雖然在業(yè)務(wù)層面上并不是一個常量,而是防止程序運(yùn)行過程中錯誤地修改它引用。
——Swift 2.0中的print函數(shù)4種重載形式
print(_:)。輸出變量或常量到控制臺,并且換行。
print(_:_:)。輸出變量或常量到指定類型的流中,并且換行。
print(_:appendNewline:)。輸出變量或常量到控制臺,appendNewline參數(shù)是布爾值,true表示換行,false表示不換行。
print(_:_:appendNewline:) 。輸出變量或常量指定類型的流中,appendNewline參數(shù)是布爾值,true表示換行,false表示不換行。
——在Swift中,表達(dá)式有3種形式
1、不指定數(shù)據(jù)類型??? var a1 = 10
2、指定數(shù)據(jù)類型????? var a1:Int? = 10
3、使用分號????????? var a1:Int = 10; var a2:Int = 20
在Swift語言中,一條語句結(jié)束后可以不加分號也可以添加分號,但是有一種情況必須要用分號,那就是多條語句寫在一行的時候,需要通過分號來區(qū)別語句。
例如:? var a1:Int = 10; var a2:Int = 20;
——Swift的運(yùn)算符
在Swift語言中主要的運(yùn)算符包括算術(shù)、關(guān)系、邏輯、位運(yùn)算符等
一元運(yùn)算符:
-??? 取反符號?取反運(yùn)算
++??? 自加一?先取值再加一,或先加一再取值
--??? 自減一?先取值再減一,或先減一再取值
二元運(yùn)算符:
+?? 加? 求和,還可用String類型,進(jìn)行字符串連接操作
-?? 減? 求差
*?? 乘? 求積
/?? 除? 求商
% ? ??取余?求余數(shù)
幾個特殊運(yùn)算符:
???引用號(.):實例調(diào)用屬性、方法等操作符。
???問號(?):用來聲明可選類型。
???感嘆號(!):對可選類型值進(jìn)行強(qiáng)制拆封。
???箭頭(->):說明函數(shù)或方法返回值類型。
???冒號運(yùn)算符(:):用于字典集合分割“鍵值”對。
——Swift中數(shù)據(jù)類型
整型、浮點型、布爾型、字符、字符串這些類型是一定有的,其中集合、枚舉、結(jié)構(gòu)體、類也是Swift中的數(shù)據(jù)類型。元組是Swift中特有的。
元組是一種數(shù)據(jù)結(jié)構(gòu),在數(shù)學(xué)中應(yīng)用廣泛。在計算機(jī)科學(xué)中,元組是關(guān)系數(shù)據(jù)庫中的基本概念,元組表中的一條記錄,每列就是一個字段。因此在二維表里,元組也稱為記錄。
現(xiàn)在使用Swift語法表示Student元組就是:
?第一種寫法
?("1001", "張三", 30, 90) ???????????????????
?第二種寫法
?(id:"1001", name:"張三", english_score:30, chinese_score:90)
——數(shù)據(jù)類型之整型和浮點型
Swift提供8、16、32、64位形式的有符號及無符號整數(shù)。這些整數(shù)類型遵循C語言的命名規(guī)約,我歸納了Swift中的整型:
整型示例:
print("UInt8 range: \(UInt8.min) ~ \(UInt8.max)")
print("Int8 range: \(Int8.min) ~ \(Int8.max)")
print("UInt range: \(UInt.min) ~ \(UInt.max)")
print("UInt64 range: \(UInt64.min) ~ \(UInt64.max)")
print("Int64 range: \(Int64.min) ~ \(Int64.max)")
print("Int range: \(Int.min) ~ \(Int.max)")
輸出結(jié)果如下:
UInt8 range: 0 ~ 255
Int8 range: -128 ~ 127
UInt range: 0 ~ 18446744073709551615
UInt64 range: 0 ~ 18446744073709551615
Int64 range: -9223372036854775808 ~ 9223372036854775807
Int range: -9223372036854775808 ~ 9223372036854775807
上述代碼是通過整數(shù)的min和max屬性計算各個類型的范圍。
浮點型主要用來儲存小數(shù)數(shù)值,也可以用來儲存范圍較大的整數(shù)。它分為浮點數(shù)(float)和雙精度浮點數(shù)(double)兩種,雙精度浮點數(shù)所使用的內(nèi)存空間比浮點數(shù)多,可表示的數(shù)值范圍與精確度也比較大。
——字符串的插入、刪除和替換
splice(_:atIndex:)。在索引位置插入字符串。
insert(_:atIndex:)。在索引位置插入字符。
removeAtIndex(_:)。在索引位置刪除字符。
removeRange(_:)。刪除指定范圍內(nèi)的字符串。
replaceRange(_:, with: String) 。使用字符串或字符替換指定范圍內(nèi)的字符串。
代碼:
var str = "Swift"
print("原始字符串:\(str)")
str.splice("Objective-C and ".characters, atIndex: str.startIndex)
print("插入字符串后:\(str)")
str.insert(".", atIndex: str.endIndex)
print("插入.字符后:\(str)")
str.removeAtIndex(str.endIndex.predecessor())
print("刪除.字符后:\(str)")
var startIndex = str.startIndex
var endIndex = advance(startIndex, 9)
var range = startIndex...endIndex
str.removeRange(range)
print("刪除范圍后:\(str)")
startIndex = str.startIndex
endIndex = advance(startIndex, 0)
range = startIndex...endIndex
str.replaceRange(range, with: "C++")
print("替換范圍后:\(str)")
輸出結(jié)果:
原始字符串:Swift
插入字符串后:Objective-C and Swift
插入.字符后:Objective-C and Swift.
刪除.字符后:Objective-C and Swift
刪除范圍后:C and Swift
替換范圍后:C++ and Swift
——請注意數(shù)字類型之間的轉(zhuǎn)換
在C、Objective-C和Java等其他語言中,整型之間有兩種轉(zhuǎn)換方法:
1、 從小范圍數(shù)到大范圍數(shù)轉(zhuǎn)換是自動的;
2、 從大范圍數(shù)到小范圍數(shù)需要強(qiáng)制類型轉(zhuǎn)換,有可能造成數(shù)據(jù)精度的丟失。
而在Swift中這兩種方法是行不通的,需要通過一些函數(shù)進(jìn)行顯式地轉(zhuǎn)換,代碼如下:
let historyScore:UInt8 = 90
let englishScore:UInt16 = 130
let totalScore = historyScore + englishScore? //錯誤
程序就會有編譯錯誤,原因是historyScore是UInt8類型,而englishScore是UInt16類型,它們之間不能轉(zhuǎn)換。
兩種轉(zhuǎn)換方法:
· 一種是把UInt8的historyScore轉(zhuǎn)換為UInt16類型。由于是從小范圍數(shù)轉(zhuǎn)換為大范圍數(shù),這種轉(zhuǎn)換是安全的。
代碼: let totalScore = UInt16(historyScore) + englishScore? //是正確的轉(zhuǎn)換方法。
·另外一種是把UInt16的englishScore轉(zhuǎn)換為UInt8類型。由于是從大范圍數(shù)轉(zhuǎn)換為小范圍數(shù),這種轉(zhuǎn)換是不安全的,如果轉(zhuǎn)換的數(shù)比較大可能會造成精度的丟失。
代碼:let totalScore = historyScore + UInt8(englishScore)? //是正確的轉(zhuǎn)換方法。
整型與浮點型之間的轉(zhuǎn)換與整型之間的轉(zhuǎn)換類似:
let historyScore:Float = 90.6
let englishScore:UInt16 = 130
let totalScore = historyScore + englishScore? //錯誤
let totalScore = historyScore + Float(englishScore)? //正確,安全
let totalScore = UInt16(historyScore) + englishScore? //正確,小數(shù)被截掉
——字典集合
Swift字典表示一種非常復(fù)雜的集合,允許按照某個鍵來訪問元素。字典是由兩部分集合構(gòu)成的,一個是鍵(key)集合,一個是值(value)集合。鍵集合是不能有重復(fù)元素的,而值集合是可以重復(fù)的,鍵和值是成對出現(xiàn)的。
字典聲明與初始化
Swift字典類型是Dictionary,也是一個泛型集合。
在聲明一個Dictionary類型的時候可以使用下面的語句之一。
var studentDictionary2: [Int: String]
聲明的字典需要進(jìn)行初始化才能使用,字典類型往往是在聲明的同時進(jìn)行初始化的。
var studentDictionary1: Dictionary<Int, String>= [102 : "張三",105 : "李四", 109 : "王五"] var studentDictionary2 = [102 : "張三",105 : "李四", 109 : "王五"] let studentDictionary3 = [102 : "張三",105 : "李四", 109 : "王五"]
字典遍歷
字典遍歷過程可以只遍歷值的集合,也可以只遍歷鍵的集合,也可以同時遍歷。這些遍歷過程都是通過for-in循環(huán)實現(xiàn)的。
for studentID in studentDictionary.keys {
print("學(xué)號:\(studentID)")
} print("---遍歷值---")
for studentName in studentDictionary.values {
print("學(xué)生:\(studentName)")
} print("---遍歷鍵:值---")
for (studentID, studentName) in studentDictionary {
print ("\(studentID) : \(studentName)")
}
運(yùn)行結(jié)果如下:
---遍歷鍵---
學(xué)號:105
學(xué)號:102
學(xué)號:109
---遍歷值---
學(xué)生:李四
學(xué)生:張三
學(xué)生:王五
---遍歷鍵:值---
105 : 李四
102 : 張三
109 : 王五
——Swift中數(shù)組集合
數(shù)組(Array)是一串有序的由相同類型元素構(gòu)成的集合。數(shù)組中的集合元素是有序的,可以重復(fù)出現(xiàn)。
聲明一個Array類型的時候可以使用下面的語句之一。
var studentList1: Array<String>??
var studentList2: [String]
聲明的Array還不能用,還需要進(jìn)行初始化,Array類型往往在聲明的同時進(jìn)行初始化。示例代碼如下:
var studentList1: Array<String> = ["張三","李四","王五","趙六"]?
var studentList2: [String]? = ["張三","李四","王五","趙六"]?
let studentList3: [String]? = ["張三","李四","王五","趙六"]?
var studentList4 = [String]()?
數(shù)組遍歷
數(shù)組最常用的操作是遍歷,就是將數(shù)組中的每一個元素取出來,進(jìn)行操作或計算。整個遍歷過程與循環(huán)分不開,可以使用for-in循環(huán)。
var studentList: [String]? = ["張三","李四","王五"]?
for item in studentList {???
??? print (item)
}?
for (index, value) in studentList.enumerate() {
??? print("Item \(index + 1 ) : \(value)")
}
運(yùn)行結(jié)果如下:
張三
李四
王五
Item 1 : 張三
Item 2 : 李四
Item 3 : 王五
——函數(shù)參數(shù)傳遞
函數(shù)的語法格式如下:
func函數(shù)名(參數(shù)列表) ->返回值類型{
語句組
return返回值
}
函數(shù):關(guān)鍵字是func。
多個參數(shù)列表之間可以用逗號(,)分隔,也可以沒有參數(shù)。
使用箭頭“->”指示返回值類型。返回值有單個值和多個值。如果函數(shù)沒有返回值,則“->返回值類型”部分可以省略。
如果函數(shù)有返回值,就需要在函數(shù)體最后使用return語句;如果沒有返回值,則函數(shù)體中可以省略return語句。
函數(shù)定義示例代碼如下:
func rectangleArea(width:Double, height:Double) -> Double {
let area = width * height
return area
}
print("320x480的長方形的面積:\(rectangleArea(320, height:480))")
下面介紹幾種不同形式的傳遞參數(shù)。
1.使用外部參數(shù)名
為每個參數(shù)提供一個可以在函數(shù)外部使用的名稱,稱為外部參數(shù)名,修改rectangleArea函數(shù)的定義如下:
func rectangleArea(W width:Double, H height:Double) -> Double {
let area = width * height
return area
}
在局部參數(shù)名之前給一個“外部參數(shù)名”,用空格分隔。定義代碼中的W和H就是外部參數(shù)名。調(diào)用代碼如下:
print("320x480的長方形的面積:\(rectangleArea(W:320, H:480))")
如果我們提供了外部參數(shù)名,那么在函數(shù)調(diào)用時,必須使用外部參數(shù)名,所以W和H不能省略。
2.省略外部參數(shù)名
Swift 2.0提供省略外部參數(shù)名可能,在定義函數(shù)時,使用下劃線(_)表示外部參數(shù)名,示例代碼如下:
func rectangleArea(width:Double, _ height:Double) -> Double {
let area = width * height
return area
}
這樣函數(shù)在調(diào)用時就可以省略外部參數(shù)名,代碼如下:
print("320x480的長方形的面積:\(rectangleArea(320, 480))")
在定義函數(shù)時第一個參數(shù)不需要使用下劃線(_),默認(rèn)第一個參數(shù)名是省略的,其他參數(shù)名要想省略則需要使用下劃線(_)符號。
3.參數(shù)默認(rèn)值
在定義函數(shù)的時候可以為參數(shù)設(shè)置一個默認(rèn)值,當(dāng)調(diào)用函數(shù)的時候可以忽略該參數(shù)??聪旅娴囊粋€示例:
func makecoffee(type :String = "卡布奇諾") -> String {
return "制作一杯\(type)咖啡。"
}
在調(diào)用的時候,如果調(diào)用者沒有傳遞參數(shù),則使用默認(rèn)值。調(diào)用代碼如下:
let coffee1= makecoffee("拿鐵")
let coffee2= makecoffee()
最后輸出結(jié)果如下:
制作一杯拿鐵咖啡。
制作一杯卡布奇諾咖啡。
4.可變參數(shù)
Swift中函數(shù)的參數(shù)個數(shù)可以變化,它可以接受不確定數(shù)量的輸入類型參數(shù),它們具有相同的類型。我們可以通過在參數(shù)類型名后面加入(...)的方式來指示這是可變參數(shù)。
下面看一個示例:
func sum(numbers:Double...) -> Double {
var total: Double = 0
for number in numbers {
total += number
}
return total
}
下面是兩次調(diào)用sum函數(shù)代碼:
sum(100.0, 20, 30)
sum(30, 80)
可以看到每次傳遞參數(shù)的個數(shù)是不同的。
?
這是我在學(xué)Swift整理的基礎(chǔ)筆記,希望給更多剛學(xué)IOS開發(fā)者帶來幫助,在這里博主非常感謝大家的支持!
更多的請到參考我下一篇博文。之后還在持續(xù)更新中。。。
轉(zhuǎn)載于:https://www.cnblogs.com/ZRJ-boke/p/6103943.html
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的从0开始学Swift笔记整理(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 序列化反序列化api(入门级)
- 下一篇: sql 2012中获取表的信息,包含字段