learning notes for swift<1>

swift語言從剛剛出道時(shí)火的不行糯景,到現(xiàn)在逐漸的熱度消退贱案。作為Apple官方主推的一種新的編程語言,自從Open Source以來惊橱,吸引了一大批牛人投入到開源社區(qū)進(jìn)行討論蚪腐。雖然平時(shí)在使用swift語言,但是對(duì)其很多語言的細(xì)節(jié)還是不夠清晰税朴。同時(shí)swift3.0也即將發(fā)布回季,頓時(shí)感覺需要對(duì)其語法進(jìn)行重新梳理,整理好這門語言的來龍去脈正林。放松心情泡一,迎接swift3.0的到來。
本文主要是基于swift2.0版本語法的整理觅廓。鍛煉自己表達(dá)能力鼻忠,同時(shí)記錄下自己學(xué)習(xí)的過程,以備自己復(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ù)字開頭芥永,但是可以在常量與變量名的其他地方包含數(shù)字。

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

var num: Int
num = 10```

#####枚舉
+ 定義枚舉
寫法1

enum num{
case one, two, three
}

寫法2

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

寫法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è)值耳标,可以使用通配符來忽略


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

swift中提供數(shù)組次坡,字典和集合三種基本的集合類型來存儲(chǔ)集合數(shù)據(jù)呼猪。
   > 數(shù)組是有序有重復(fù)集合
        字典是無序鍵值對(duì)集
        集合是無序無重復(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ù)組來定義一個(gè)set,其中重復(fù)的元素會(huì)只顯示一個(gè),自動(dòng)忽略其他重復(fù)的元素砸琅。
var sess2:Set<String> = ["name", "zz", "age","age"]
//sess2的定義是使用數(shù)組來定義一個(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í)排序基本沒有意義棕所。測試代碼
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)算符( == )來判斷兩個(gè)集合是否包含全部相同的值。
    (判斷set元素相等還可以使用哈希值笑撞,swift中所有的基本數(shù)據(jù)類型都是可以hash的岛啸,哈希值相等可以判斷對(duì)象相同,如a == b
即a.hashValue == b.hashValue)
- 使用 isSubsetOf(_:) 方法來判斷一個(gè)集合中的值是否也被包含在另外一個(gè)集合中茴肥。
- 使用 isSupersetOf(_:) 方法來判斷一個(gè)集合中包含另一個(gè)集合中所有的值坚踩。
- 使用 isStrictSubsetOf(_:) 或者 isStrictSupersetOf(_:) 方法來判斷一個(gè)集合是否是另外一個(gè)集合的子集合或者父集合并且兩個(gè)集合并不相等。
- 使用 isDisjointWith(_:) 方法來判斷兩個(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)來定義

+字符

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á)式是沒有值的. 避免 if (c == 9) 這種情況誤寫為 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)算符來進(jìn)行操作:
溢出加法 &+
溢出減法 &-
溢出乘法 &*
溢出除法 &/
溢出求余 &%

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

//有值
var optionalTest:Int? = 9
//沒有值
var optionalTest:Int?
var optionalTest:Int? = nil

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

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

#####注釋
以c語言注釋非常像

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

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

和c語言不一樣外驱,swift多行注釋可以嵌套

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


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

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)和無符號(hào)整數(shù)類型。這種按照長度進(jìn)行劃分趟薄,更加精確绽诚,也更節(jié)省內(nèi)存空間。
+ 默認(rèn)情況下數(shù)據(jù)類型分為有符號(hào)的和無符號(hào)的杭煎,也就是說有符號(hào)的Int8的范圍是(-128 ~ 127),無符號(hào)的UInt8的范圍是(0 ~ 255)如果超出了范圍編譯器會(huì)報(bào)錯(cuò)誤恩够。
+ swift為我們提供了特殊類型Int,它與當(dāng)前平臺(tái)的原生字長度相同羡铲。
   - 在32位平臺(tái)上, Int和Int32長度相同蜂桶。 
   - 在64位平臺(tái)上, Int和Int64長度相同。
當(dāng)然也有無符號(hào)的特殊類型UInt也切,和Int一樣它也是與當(dāng)前平臺(tái)的原生字長度相同扑媚。

######浮點(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
*/
以上語句會(huì)報(bào)錯(cuò)旬痹。
正確寫法
var intValue:Int = 10
var doubleValue:Double
doubleValue = Double(intValue)

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

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

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

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


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

#####控制語句
+ 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還可以用來循環(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)系作者
  • 序言:七十年代末吟榴,一起剝皮案震驚了整個(gè)濱河市魁蒜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吩翻,老刑警劉巖兜看,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異狭瞎,居然都是意外死亡细移,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門熊锭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來弧轧,“玉大人,你說我怎么就攤上這事碗殷【铮” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵锌妻,是天一觀的道長代乃。 經(jīng)常有香客問我,道長仿粹,這世上最難降的妖魔是什么搁吓? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮吭历,結(jié)果婚禮上擎浴,老公的妹妹穿的比我還像新娘。我一直安慰自己毒涧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著契讲,像睡著了一般仿吞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上捡偏,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天唤冈,我揣著相機(jī)與錄音,去河邊找鬼银伟。 笑死你虹,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的彤避。 我是一名探鬼主播傅物,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼琉预!你這毒婦竟也來了董饰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤圆米,失蹤者是張志新(化名)和其女友劉穎卒暂,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體娄帖,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡也祠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了近速。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诈嘿。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖数焊,靈堂內(nèi)的尸體忽然破棺而出永淌,到底是詐尸還是另有隱情,我是刑警寧澤佩耳,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布遂蛀,位于F島的核電站,受9級(jí)特大地震影響干厚,放射性物質(zhì)發(fā)生泄漏李滴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一蛮瞄、第九天 我趴在偏房一處隱蔽的房頂上張望所坯。 院中可真熱鬧,春花似錦挂捅、人聲如沸芹助。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽状土。三九已至无蜂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蒙谓,已是汗流浹背斥季。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留累驮,地道東北人酣倾。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像谤专,于是被迫代替她去往敵國和親躁锡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

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