Swift不要求在每行語句的結(jié)尾使用分號(;),但當(dāng)你在同一行書寫多條語句時,必須用分號隔開 :
var myString="Hello, World!";print(myString)
Optional 是一個含有兩種情況的枚舉,None和Some(T)漆腌,用來表示可能有或可能沒有值。任何類型都可以明確聲明為(或者隱式轉(zhuǎn)換)可選類型阶冈。當(dāng)聲明一個可選類型的時候,要確保用括號給塑径?操作符一個合適的范圍女坑。例如,聲明可選整數(shù)數(shù)組统舀,應(yīng)該寫成([Int])?匆骗;寫成Int[]?會報錯劳景。
整型字面量
整型字面量可以是一個十進制,二進制碉就,八進制或十六進制常量盟广。 二進制前綴為 0b,八進制前綴為 0o瓮钥,十六進制前綴為 0x筋量,十進制沒有前綴:
以下為一些整型字面量的實例:
let decimalInteger=17 // 17 - 十進制表示
let binaryInteger=0b10001 // 17 - 二進制表示
let octalInteger=0o21 // 17 - 八進制表示
let hexadecimalInteger=0x11 // 17 - 十六進制表示
1.25e2 表示 1.25 ? 10^2,也就是 125.0碉熄;同樣桨武,1.25e-2 表示 1.25 ? 10^-2,也就是 0.0125锈津。
字符串型字面量
字符串型字面量由被包在雙引號中的一串字符組成呀酸,形式如下:
"characters"
字符串型字面量中不能包含未轉(zhuǎn)義的雙引號 (")、未轉(zhuǎn)義的反斜線(\)琼梆、回車符或換行符性誉。
轉(zhuǎn)移字符含義
\0空字符
\\反斜線 \
\b退格(BS) ,將當(dāng)前位置移到前一列
\f換頁(FF)茎杂,將當(dāng)前位置移到下頁開頭
\n換行符
\r回車符
\t水平制表符
\v垂直制表符
\'單引號
\"雙引號
\0001到3位八進制數(shù)所代表的任意字符
\xhh...1到2位十六進制所代表的任意字符
以下為字符串字面量的簡單實例:
let stringL="Hello\tWorld\n\n全棧教程官網(wǎng):\'http://www.jser.com\'"
print(stringL)
以上程序執(zhí)行結(jié)果為:
Hello World
全棧教程官網(wǎng):'http://www.jser.com'
控制語句描述
continue 語句
告訴一個循環(huán)體立刻停止本次循環(huán)迭代错览,重新開始下次循環(huán)迭代。
break 語句
中斷當(dāng)前循環(huán)蛉顽。
fallthrough 語句
如果在一個case執(zhí)行完后蝗砾,繼續(xù)執(zhí)行下面的case,需要使用fallthrough(貫穿)關(guān)鍵字携冤。
字符串函數(shù)及運算符
Swift 支持以下幾種字符串函數(shù)及運算符:
**isEmpty:**判斷字符串是否為空悼粮,返回布爾值
**hasPrefix(prefix: String):**檢查字符串是否擁有特定前綴
**hasSuffix(suffix: String):**檢查字符串是否擁有特定后綴。
**Int(String):**轉(zhuǎn)換字符串?dāng)?shù)字為整型曾棕。 實例:
let myString: String = "256"
let myInt: Int? = Int(myString)
**String.characters.count:**計算字符串的長度
遍歷字符串中的字符
Swift 的 String 類型表示特定序列的 Character(字符) 類型值的集合扣猫。 每一個字符值代表一個 Unicode 字符。
您可通過for-in循環(huán)來遍歷字符串中的characters屬性來獲取每一個字符的值:
for ch in"Hello".characters { print(ch) }
創(chuàng)建數(shù)組
以下實例創(chuàng)建了一個類型為 Int 翘地,大小為 3申尤,初始值為 0 的空數(shù)組:
var someInts = [Int](count: 3, repeatedValue: 0)
var someStrs=[String()
someStrs.append("Apple")
someStrs+=["Google"]
// enumerate() 以元組的形式遍歷數(shù)組
for (index, item) in someStrs.enumerate() {print("在 index = \(index) 位置上的值為 \(item)")}
可以通過只讀屬性 isEmpty 來判斷數(shù)組是否為空
移除 Key-Value 對
我們可以使用removeValueForKey()方法來移除字典 key-value 對。如果 key 存在該方法返回移除的值衙耕,如果不存在返回 nil 昧穿。實例如下:
var someDict:[ Int : String]=[1:"One",2:"Two",3:"Three"]
var removedValue=someDict.removeValueForKey(2)
遍歷字典
我們可以使用for-in循環(huán)來遍歷某個字典中的鍵值對。實例如下:
var someDict:[Int: String]=[1:"One",2:"Two",3:"Three"]
for ( key, value) in someDict {print("字典 key \(key) - 字典 value \(value)")}
使用只讀的count屬性來計算字典有多少個鍵值對
通過只讀屬性isEmpty來判斷字典是否為空
輸入輸出函數(shù)
定義一個輸入輸出參數(shù)時橙喘,在參數(shù)定義前加 inout 關(guān)鍵字时鸵。一個輸入輸出參數(shù)有傳入函數(shù)的值,這個值被函數(shù)修改,然后被傳出函數(shù)饰潜,替換原來的值初坠。
fun cswapTwoInts (inouta: Int, inoutb: Int){
let = a
a = b
b = t
}
var x =0,y =100
print("x =\(x) ;y =\(y)")
swapTwoInts(&x, b:&y)
print("x =\(x) ;y =\(y)")
函數(shù)嵌套
函數(shù)嵌套指的是函數(shù)內(nèi)定義一個新的函數(shù),外部的函數(shù)可以調(diào)用函數(shù)內(nèi)定義的函數(shù)彭雾。
實例如下:
func calcDecrement(forDecrement total:Int)->()->Int{
var overallDecrement=0
func decrementer()->Int{
overallDecrement-=total
return overallDecrement
}
return decrementer
}
let decrem=calcDecrement(forDecrement:30)
print(decrem())
以上程序執(zhí)行輸出結(jié)果為:
-30
sort 函數(shù)
sort(:)方法會返回一個與原數(shù)組大小相同,包含同類型元素且元素已正確排序的新數(shù)組碟刺,原數(shù)組不會被sort(:)方法修改。
sort(_:)方法需要傳入兩個參數(shù):
1.已知類型的數(shù)組
2.閉包函數(shù)薯酝,該閉包函數(shù)需要傳入與數(shù)組元素類型相同的兩個值半沽,并返回一個布爾類型值來表明當(dāng)排序結(jié)束后傳入的第一個參數(shù)排在第二個參數(shù)前面還是后面。如果第一個參數(shù)值出現(xiàn)在第二個參數(shù)值前面蜜托,排序閉包函數(shù)需要返回true抄囚,反之返回false。
實例
let names=["AT","AE","D","S","BE"]
// 使用普通函數(shù)(或內(nèi)嵌函數(shù))提供排序功能,閉包函數(shù)類型需為(String, String) -> Bool橄务。
func backwards( s1:String, s2:String)>Bool{
returns1>s2
}
var reversed=names.sort(backwards)
print(reversed)
以上程序執(zhí)行輸出結(jié)果為:
["S", "D", "BE", "AT", "AE"]
如果第一個字符串 (s1) 大于第二個字符串 (s2)幔托,backwards函數(shù)返回true,表示在新的數(shù)組中s1應(yīng)該出現(xiàn)在s2前蜂挪。 對于字符串中的字符來說重挑,"大于" 表示 "按照字母順序較晚出現(xiàn)"。 這意味著字母"B"大于字母"A"棠涮,字符串"S"大于字符串"D"谬哀。 其將進行字母逆序排序,"AT"將會排在"AE"之前严肪。
參數(shù)名稱縮寫功能
您可以直接通過$0,$1,$2來順序調(diào)用閉包的參數(shù)史煎。
實例
let names = ["AT","AE","D","S","BE"]
var reversed = names.sort({$0>$1})
print(reversed)
$0和$1表示閉包中第一個和第二個String類型的參數(shù)。
以上程序執(zhí)行輸出結(jié)果為:
["S", "D", "BE", "AT", "AE"]
如果你在閉包表達(dá)式中使用參數(shù)名稱縮寫, 您可以在閉包參數(shù)列表中省略對其定義, 并且對應(yīng)參數(shù)名稱縮寫的類型會通過函數(shù)類型進行推斷驳糯。in 關(guān)鍵字同樣也可以被省略.
尾隨閉包
尾隨閉包是一個書寫在函數(shù)括號之后的閉包表達(dá)式篇梭,函數(shù)支持將其作為最后一個參數(shù)調(diào)用。
func someFunctionThatTakesAClosure(closure:()->Void){
// 函數(shù)體部分
}
// 以下是不使用尾隨閉包進行函數(shù)調(diào)用
someFunctionThatTakesAClosure({
// 閉包主體部分
})
// 以下是使用尾隨閉包進行函數(shù)調(diào)用
someFunctionThatTakesAClosure(){
// 閉包主體部分
}
結(jié)構(gòu)體應(yīng)用
在你的代碼中酝枢,你可以使用結(jié)構(gòu)體來定義你的自定義數(shù)據(jù)類型恬偷。
結(jié)構(gòu)體實例總是通過值傳遞來定義你的自定義數(shù)據(jù)類型。
按照通用的準(zhǔn)則帘睦,當(dāng)符合一條或多條以下條件時袍患,請考慮構(gòu)建結(jié)構(gòu)體:
1 結(jié)構(gòu)體的主要目的是用來封裝少量相關(guān)簡單數(shù)據(jù)值。
2 有理由預(yù)計一個結(jié)構(gòu)體實例在賦值或傳遞時竣付,封裝的數(shù)據(jù)將會被拷貝而不是被引用诡延。
3 任何在結(jié)構(gòu)體中儲存的值類型屬性,也將會被拷貝古胆,而不是被引用孕暇。
結(jié)構(gòu)體不需要去繼承另一個已存在類型的屬性或者行為。
舉例來說赤兴,以下情境中適合使用結(jié)構(gòu)體:
- 幾何形狀的大小妖滔,封裝一個width屬性和height屬性,兩者均為Double類型桶良。
- 一定范圍內(nèi)的路徑座舍,封裝一個start屬性和length屬性,兩者均為Int類型陨帆。
- 三維坐標(biāo)系內(nèi)一點曲秉,封裝x,y和z屬性疲牵,三者均為Double類型承二。
在實例方法中修改值類型
Swift 語言中結(jié)構(gòu)體和枚舉是值類型。一般情況下纲爸,值類型的屬性不能在它的實例方法中被修改亥鸠。
但是,如果你確實需要在某個具體的方法中修改結(jié)構(gòu)體或者枚舉的屬性识啦,你可以選擇變異(mutating)這個方法负蚊,然后方法就可以從方法內(nèi)部改變它的屬性;并且它做的任何改變在方法結(jié)束時還會保留在原始結(jié)構(gòu)中颓哮。
方法還可以給它隱含的self屬性賦值一個全新的實例家妆,這個新實例在方法結(jié)束后將替換原來的實例。
struct area{
var length = 1
var breadth = 1
func area()->Int{
return length*breadth
}
mutating func scaleBy(res:Int){
length *= res
breadth *= res
print(length)
print(breadth)
}
}
var val=area(length:3,breadth:5)
val.scaleBy(3)
val.scaleBy(30)
val.scaleBy(300)