learning notes for swift<1>

swift語(yǔ)言從剛剛出道時(shí)火的不行,到現(xiàn)在逐漸的熱度消退。作為Apple官方主推的一種新的編程語(yǔ)言,自從Open Source以來(lái),吸引了一大批牛人投入到開(kāi)源社區(qū)進(jìn)行討論。雖然平時(shí)在使用swift語(yǔ)言,但是對(duì)其很多語(yǔ)言的細(xì)節(jié)還是不夠清晰。同時(shí)swift3.0也即將發(fā)布,頓時(shí)感覺(jué)需要對(duì)其語(yǔ)法進(jìn)行重新梳理,整理好這門(mén)語(yǔ)言的來(lái)龍去脈。放松心情,迎接swift3.0的到來(lái)。
本文主要是基于swift2.0版本語(yǔ)法的整理。鍛煉自己表達(dá)能力,同時(shí)記錄下自己學(xué)習(xí)的過(guò)程,以備自己復(fù)習(xí)查詢。

hello swift

打印
print("hello swift")

常量和變量
  • 常量
let num1: Int = 20
let num2 = 20
  • 變量
var num2: Int = 20
var num3 = 20

命名規(guī)則:常量與變量名不能包含數(shù)學(xué)符號(hào),箭頭,保留的(或者非法的)Unicode 碼位,連線與制表符。也不能以數(shù)字開(kāi)頭,但是可以在常量與變量名的其他地方包含數(shù)字。

當(dāng)你聲明常量或者變量的時(shí)候可以加上類型標(biāo)注(type annotation),說(shuō)明常量或者變量中要存儲(chǔ)的值的類型。如果要添加類型標(biāo)注,需要在常量或者變量名后面加上一個(gè)冒號(hào)和空格,然后加上類型名稱。

var num: Int
num = 10```

#####枚舉
+ 定義枚舉
寫(xiě)法1

enum num{
case one, two, three
}

寫(xiě)法2

enum num{
case one,
case two,
case three
}

寫(xiě)法3:定義枚舉同時(shí)定義類型,默認(rèn)是整形,后面的值+1。

enum height:Double{
case one = 2.0,
case one = 3.0,
case one = 4.0
}


+ 定義枚舉變量

var number1 = num.one
或者
var number2: num = one

當(dāng)然定義也可以使用常量let
```let number2: num = one```

+ 枚舉原始值
print(num.one.rawValue)

#####元組
元組(tuples)把多個(gè)值組合成一個(gè)復(fù)合值。元組內(nèi)的值可以是任意類型,并不要求是相同類型。

let student = ("小明", 20, 99.0)


取得元組的第一個(gè)值

print(student.0)


其他定義方式

let student2 = (name:"小明",age:20,score:99.0)
let (name , age , score) = ("小明", 20, 99.0)
let (name1 , age1 , ) = ("小明", 20, 99.0)//不關(guān)心元組中某一個(gè)值,可以使用通配符來(lái)忽略


#####集合類型:數(shù)組,字典,集合

swift中提供數(shù)組,字典和集合三種基本的集合類型來(lái)存儲(chǔ)集合數(shù)據(jù)。
   > 數(shù)組是有序有重復(fù)集合
        字典是無(wú)序鍵值對(duì)集
        集合是無(wú)序無(wú)重復(fù)的集合
![](http://upload-images.jianshu.io/upload_images/1101711-1aef8e9ccfd6d30b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

+ 數(shù)組(Arrays)

var arr = [1,2,3]
var arr1:Array = [1,2,3]
var arr2:Array<Int> = [1,2,3]
var arr3:[Int] = [1,2,3]
//空數(shù)組
var arrEmpty =[]
var arrEmpty1:Array =[]
var arrEmpty2:Array<Int> =[]
var arrEmpty3:[Int] =[]

//不可變數(shù)組:
var arr8 = []
//可變數(shù)組:
let arr9 = []

// 如果想明確表示數(shù)組中存放的是不同類型的數(shù)據(jù), 可以使用Any關(guān)鍵字, 表示數(shù)組中可以存放不同類型的數(shù)據(jù)
var arr11:Array<Any> = [1, "lnj", 1.75]

// 數(shù)組遍歷
var arr1 = [1, 2, 3]
for var i = 0 ; i < arr1.count ; i++
{
print(arr1[i])
}

for number in arr1
{
print(number)
}

for i in 0..<arr1.count
{
print(arr1[i])
}

// 取出數(shù)組中某個(gè)區(qū)間范圍的值
var arr2 = [1, 2, 3]
for number in arr2[0..<3]
{
print(number)
}


+ 字典(Dictionarys)

var dict = ["name":"zz", "age":20]
var dict1:Dictionary = ["name":"zz", "age":20]
var dict2:Dictionary<String,AnyObject> = ["name":"zz", "age":20]
var dict3:[String:AnyObject] = ["name":"zz", "age":20]
var dict4:[String:AnyObject] = Dictionary(dictionaryLiteral: ("name", "zz"), ("age", 20))

//不可變數(shù)組:
var dict5 = [:]
//可變數(shù)組:
let dict6 = [:]

//遍歷字典
var dict7 = ["name":"zz", "age":20]
for (key , value) in dict7
{
print("key = (key) value = (value)")
}

var dict8 = ["name":"zz", "age":20]
for key in dict8.keys
{
print("key = (key)")
}

var dict9 = ["name":"zz", "age":20]
for value in dict9.values
{
print("value = (value)")
}


+ 集合(Sets)
當(dāng)對(duì)元素的順序不太關(guān)注或者需要所有的元素只出現(xiàn)一次的時(shí)候可以使用集合

//var sess = ["name", "zz", "age","age",2]
//sess的定義是數(shù)組的定義
var sess1:Set = ["name", "zz", "age","age",2]
//sess1的定義是使用數(shù)組來(lái)定義一個(gè)set,其中重復(fù)的元素會(huì)只顯示一個(gè),自動(dòng)忽略其他重復(fù)的元素。
var sess2:Set<String> = ["name", "zz", "age","age"]
//sess2的定義是使用數(shù)組來(lái)定義一個(gè)set,其中重復(fù)的元素會(huì)只顯示一個(gè),指定元素為String類型,添加其他類型元素會(huì)直接報(bào)錯(cuò)。

// 遍歷set
for genre in sess1 {
print("(genre)")
}

let sess2:Set = ["name", "zz", "age"]
for genre in sess2.sort() {
print("(genre)")
}
//在sess2中如果中添加了其他了類型的元素,比如整形2。則sort() 方法就不能被調(diào)用。
//只能使用sort(isOrderedBefore: (String, String) -> Bool) 方法根據(jù)傳遞的參數(shù)自定義排序
//sort() 方法的默認(rèn)的排序按照字母az,數(shù)組09,
//如果包含中文此時(shí)排序基本沒(méi)有意義。測(cè)試代碼
let sess3: Set = ["張三", "李四", "王五", "a小李","三", "四", "五", "小","小李子"]
for genre in sess3.sort() {
print("(genre)")
}
結(jié)果:a小李 三 五 四 小 小李子 張三 李四 王五。

//其他排序方法
let constantArray: Set = [5, 1, 6, 4, 2, 3]
let bbbb = constantArray.sort{$0>$1}
print(bbbb)

let constantArray1: Set = [5, 1, 6, 4, 2, 3]
let bbbb1 = constantArray1.sort(>)
print(bbbb1)

let constantArray2: Set = [5, 1, 6, 4, 2, 3]
let bbbb2 = constantArray2.sort { (a, b) -> Bool in
return a > b
}
print(bbbb2)


**set之間的交并集**
![](http://upload-images.jianshu.io/upload_images/1101711-627623e430c9e8d7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000)

intersect:返回兩個(gè)集合中都存在的數(shù)據(jù)
exclusiveror:返回兩個(gè)集合各自特有的數(shù)據(jù),忽略兩個(gè)集合中都有的數(shù)據(jù)
union:返回兩個(gè)集合中所有數(shù)據(jù)
subtract:返回不包含右邊集合的所有數(shù)據(jù)
4個(gè)方法都把合適數(shù)據(jù)組織成一個(gè)新的集合進(jìn)行返回。
 
**set之間的比較**
- 使用“是否相等”運(yùn)算符( == )來(lái)判斷兩個(gè)集合是否包含全部相同的值。
    (判斷set元素相等還可以使用哈希值,swift中所有的基本數(shù)據(jù)類型都是可以hash的,哈希值相等可以判斷對(duì)象相同,如a == b
即a.hashValue == b.hashValue)
- 使用 isSubsetOf(_:) 方法來(lái)判斷一個(gè)集合中的值是否也被包含在另外一個(gè)集合中。
- 使用 isSupersetOf(_:) 方法來(lái)判斷一個(gè)集合中包含另一個(gè)集合中所有的值。
- 使用 isStrictSubsetOf(_:) 或者 isStrictSupersetOf(_:) 方法來(lái)判斷一個(gè)集合是否是另外一個(gè)集合的子集合或者父集合并且兩個(gè)集合并不相等。
- 使用 isDisjointWith(_:) 方法來(lái)判斷兩個(gè)集合是否不含有相同的值。
            let a: Set = ["a", "b", "c", "d", "e"]
            let b: Set = ["a", "b"]
            let c: Set = ["a", "b", "c", "d", "e","f"]
        
            print(b.isSubsetOf(a)) // b是否包含在a中 true
            print(a == b) // a和b是否相等 false
            print(a.isSupersetOf(b)) // a是否包含b所有的值 true
            print(a.isDisjointWith(c))// a和c是否含有不相同的值 false

#####5.字符和字符串
字符和字符串都使用 **“”** 雙引號(hào)來(lái)定義

+字符

var test:Character = "李"
// 雙引號(hào)中只能有一個(gè)字符,不如想“ab”這樣定義是錯(cuò)誤的。

+字符串
字符是單個(gè)字符的集合, 字符串是多個(gè)字符的集合, 想要存放多個(gè)字符需要使用字符串,使用雙引號(hào)和+可以拼接字符串

var a = "ab"
var b = "bc"
var str = a + b;
print(str)// abbc

#####運(yùn)算符
| 運(yùn)算符 |例|
|--|--|
| 基本運(yùn)算||
|+| a+b  |
|- | a-b  |
|* | a*b  |
|/ | a/b  |
|++|  number++ |
|-- |  number--   |
| % | print(10 % 3.5)  余數(shù)為3 支持對(duì)小數(shù)取模  |
| 賦值運(yùn)算 | 不允許連續(xù)賦值, 表達(dá)式是沒(méi)有值的. 避免 if (c == 9) 這種情況誤寫(xiě)為 if (c = 9)|
| =  |m1 =  20|
| += |m1 += 10|
| -= |m1 -= 10|
| /= |m1 /= 10|
| *= |m1 *= 10|
| %= |m1 %= 5|
| 關(guān)系運(yùn)算|取得值是bool|
|>|m1  > 10|
|<|m1 < 10|
|>= |m1 >= 10|
|<=|m1 <= 10|
|== |m1 == 10|
|!=|m1 != 10|
|?:|m1 == 10 ? 11 : 12 |
| 邏輯運(yùn)算|只能操作bool類型|
|!    | if !open  |
|&& | if a >10 &&  a < 20 |
| 區(qū)間||
|... | 1...5    (1到5包括5 )|
|..<| 1..<5 (1到4不包括5)|

######\- 和 + 
特殊的關(guān)于正負(fù)數(shù)運(yùn)算的運(yùn)算符

let three = 3
let minusThree = -three // minusThree 等于 -3
let plusThree = -minusThree // plusThree 等于 3, 或 "負(fù)負(fù)3”

######?? 空和運(yùn)算符
??運(yùn)算符:(a??b)如果a值不為空,則對(duì)a進(jìn)行強(qiáng)制解包,否則就返回一個(gè)默認(rèn)值b。
運(yùn)算符有兩個(gè)條件
  + 1 表達(dá)式a必須是一個(gè)可選值類型。
  + 2 默認(rèn)值b的類型必須和a的類型保持一致

let mycolor = "red"
var userDefualColor:String?
var usercolor = userDefualColor?? mycolor

返回結(jié)果為red,因?yàn)閡serDefualColor是一個(gè)可選值,其的默認(rèn)值是空。所以返回mycolor 即red。

######溢出運(yùn)算符
Swift中如果計(jì)算結(jié)果超出了它的類型能承載的范圍,那么就會(huì)發(fā)生溢出錯(cuò)誤,除非你已經(jīng)使用溢出運(yùn)算符來(lái)進(jìn)行操作:
溢出加法 &+
溢出減法 &-
溢出乘法 &*
溢出除法 &/
溢出求余 &%

#####可選值
可選值: optionals有兩種狀態(tài): 
1.有值 2.沒(méi)有值, 沒(méi)有值就是nil

//有值
var optionalTest:Int? = 9
//沒(méi)有值
var optionalTest:Int?
var optionalTest:Int? = nil

// 可選值強(qiáng)制解包,對(duì)一個(gè)沒(méi)有值的可選值強(qiáng)制解包會(huì)報(bào)錯(cuò)。
var result = optionalTest!

// 可選綁定
if let result = optionalTest {
// do something
}

#####注釋
以c語(yǔ)言注釋非常像

// 這是一個(gè)注釋

/* 這是一個(gè),多行注釋 */

和c語(yǔ)言不一樣,swift多行注釋可以嵌套

/* 這是第一個(gè)多行注釋的開(kāi)頭
/* 這是第二個(gè)被嵌套的多行注釋 */
這是第一個(gè)多行注釋的結(jié)尾 */


#####分號(hào)
和大部分的語(yǔ)言不同,在swift語(yǔ)言中并不強(qiáng)調(diào)每一行的結(jié)束都添加分號(hào)**```;```**
當(dāng)然你也可以添加分號(hào)作為一行結(jié)束符號(hào),在swift語(yǔ)言也是可以的。
有一種必須添加分號(hào)的情況,就是在一行中你想寫(xiě)多個(gè)語(yǔ)句。比如

var me1 = 2; var me2 = 4

#####基本數(shù)據(jù)類型
######整數(shù)類型

var intValue1:Int8 = 6
var intValue2:Int16 = 7
var intValue3:Int32 = 8
var intValue4:Int64 = 9

+ Swift 提供了8,16,32和64位的有符號(hào)和無(wú)符號(hào)整數(shù)類型。這種按照長(zhǎng)度進(jìn)行劃分,更加精確,也更節(jié)省內(nèi)存空間。
+ 默認(rèn)情況下數(shù)據(jù)類型分為有符號(hào)的和無(wú)符號(hào)的,也就是說(shuō)有符號(hào)的Int8的范圍是(-128 ~ 127),無(wú)符號(hào)的UInt8的范圍是(0 ~ 255)如果超出了范圍編譯器會(huì)報(bào)錯(cuò)誤。
+ swift為我們提供了特殊類型Int,它與當(dāng)前平臺(tái)的原生字長(zhǎng)度相同。
   - 在32位平臺(tái)上, Int和Int32長(zhǎng)度相同。 
   - 在64位平臺(tái)上, Int和Int64長(zhǎng)度相同。
當(dāng)然也有無(wú)符號(hào)的特殊類型UInt,和Int一樣它也是與當(dāng)前平臺(tái)的原生字長(zhǎng)度相同。

######浮點(diǎn)類型
Double:表示64位浮點(diǎn)數(shù),精度高,存儲(chǔ)數(shù)據(jù)大,至少有15位
Float:表示32位浮點(diǎn)數(shù),至少有6位

#####類型轉(zhuǎn)換
swift中不允許隱式類型轉(zhuǎn)換,必須使用強(qiáng)制類型轉(zhuǎn)換

/*
var intValue:Int = 10
var doubleValue:Double = intValue
*/
以上語(yǔ)句會(huì)報(bào)錯(cuò)。
正確寫(xiě)法
var intValue:Int = 10
var doubleValue:Double
doubleValue = Double(intValue)

注意:Double(intValue)并不會(huì)修改intValue的值, 而是通過(guò)intValue的值生成一個(gè)臨時(shí)的值賦值給doubleValue

#####Bool類型
Swift引入了真正的Bool類型
true
false

#####類型推斷
swift是類型安全的。可以清楚的知道代碼要處理值的類型,在編譯的時(shí)候會(huì)進(jìn)行類型檢查,如果傳遞的參數(shù)類型不一致,會(huì)提示錯(cuò)誤。
盡管如此,我們?cè)诼暶鞒A炕蛘咦兞康臅r(shí)候不一定需要顯示的指定類型。如果我們沒(méi)有指定類型,swift會(huì)使用類型推斷來(lái)選擇合適的類型。

let anotherPi = 3 + 0.14159
// anotherPi 會(huì)被推測(cè)為 Double 類型,因?yàn)槌霈F(xiàn)了浮點(diǎn)數(shù)類型


#####類型別名
typealias AudioSample = UInt16
將UInt16定義別名為AudioSample,然后就可以在任何使用UInt16的地方使用新定義的別名。

#####控制語(yǔ)句
+ if
和常用用法一致

+ switch
switch可以匹配區(qū)間和元祖

let count = 3_000_000_000_000
let countedThings = "stars in the Milky Way"
var naturalCount: String
switch count {
case 0:
naturalCount = "no"
case 1...3:
naturalCount = "a few"
case 4...9:
naturalCount = "several"
case 10...99:
naturalCount = "tens of"
case 100...999:
naturalCount = "hundreds of"
case 1000...999_999:
naturalCount = "thousands of"
default:
naturalCount = "millions and millions of"
}
print("There are (naturalCount) (countedThings).")
// 輸出 "There are millions and millions of stars in the Milky Way.”

“l(fā)et somePoint = (1, 1)
switch somePoint {
case (0, 0):
print("(0, 0) is at the origin")
case (_, 0):
print("((somePoint.0), 0) is on the x-axis")
case (0, _):
print("(0, (somePoint.1)) is on the y-axis")
case (-2...2, -2...2):
print("((somePoint.0), (somePoint.1)) is inside the box")
default:
print("0")
// _ 代表可以匹配任何值


+ for
除了常用的for循環(huán)樣式,for還可以用來(lái)循環(huán)字符串的字符,元祖和區(qū)間

let numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
for (animalName, legCount) in numberOfLegs {
print("(animalName)s have (legCount) legs")
}
// spiders have 8 legs
// ants have 6 legs
// cats have 4 legs

for character in "hello"{
print(character)
}

+ while 和repeat while

var a :Int = 1
while a < 10
{
a++
}

repeat
{
a++
}while a < 10


#####函數(shù)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,119評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,382評(píng)論 3 415
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 176,038評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 62,853評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,616評(píng)論 6 408
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,112評(píng)論 1 323
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,192評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,355評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,869評(píng)論 1 334
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,727評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,928評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,467評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,165評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,570評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,813評(píng)論 1 282
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,585評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,892評(píng)論 2 372

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