swift 3.0

導(dǎo)入格式

import UIKit // 在OC 中的導(dǎo)入格式是:#import<UIkit/UIKit.h>,swift相比于OC更加簡潔

基礎(chǔ)部分

一晤郑、常量和變量

在swift中使用var表示變量,let表示常量

“Swift 包含了 C 和 Objective-C 上所有基礎(chǔ)數(shù)據(jù)類型恍涂,Int表示“整型值; Double 和 Float 表示浮點型值; Bool 是布爾型值康震;String 是文本型數(shù)據(jù)。 Swift 還提供了三個基本的集合類型宾濒,Array 腿短,Set 和 Dictionary ,詳見集合類型”

#常量

// 指定常量的類型
let isSuccess:Bool = true
let aString :String = "i`m a string ??"
let aInt :Int = 666
// 不指定常量類型,編譯器自動去判斷
let ?? = "i`m a dog"
let bInt = 888
** 常量的值不可以去修改 **

運行結(jié)果

Paste_Image.png
Paste_Image.png

#變量

// 變量
//指定變量類型
var bString :String
bString = aString
var cInt:Int
cInt = bInt

// 不指定類型
var dInt = bInt

//修改值
dInt = 0000
bString = "it`s can change"

運行結(jié)果

Paste_Image.png

二橘忱、數(shù)值類型轉(zhuǎn)換

// 整數(shù)和浮點型轉(zhuǎn)換
let three = 3  // 3
let doubleNumber = 0.1415926   // 0.1415926
let pi = Double(three)+doubleNumber  // 3.1415926
// 浮點數(shù)到整數(shù)的反轉(zhuǎn)換
let intPi = Int(pi) // 3

三赴魁、類型別名

“類型別名(type aliases)就是給現(xiàn)有類型定義另一個名字。你可以使用typealias關(guān)鍵字來定義類型別名钝诚∮庇”

typealias MyStr = String
let Str:MyStr = "我是字符串"   //  "我是字符串"

四、元組

“元組(tuples)把多個值組合成一個復(fù)合值凝颇。元組內(nèi)的值可以是任意類型潘拱,并不要求是相同類型∨÷裕”
下面這個例子中芦岂,(404, "Not Found") 是一個描述 HTTP 狀態(tài)碼(HTTP status code)的元組。HTTP 狀態(tài)碼是當你請求網(wǎng)頁的時候 web 服務(wù)器返回的一個特殊值垫蛆。如果你請求的網(wǎng)頁不存在就會返回一個 404 Not Found 狀態(tài)碼禽最。

let http404Error = (404, "Not Found")
// http404Error 的類型是 (Int, String),值是 (404, "Not Found")”

**#元組的取值方式 **
元組的取值方式主要有三種:
1.通過內(nèi)容分解
2.通過下標
3.通過元素別名

// 1.通過內(nèi)容分解來取值
let (errorCode,message) = http404Error
print("errorCode is \(errorCode)")     // "errorCode is 404"
print("message is \(message)")        // "message is Not Found"
// 如果只需要一個值得話,可以把要忽略的部分用下劃線_標記
let (errorCode1,_) = http404Error   // "404"
print(errorCode1)

// 2.通過下標來取值
let httpCode = http404Error.0  // 404

//3.通過元素的別名來取值
//先給元素起個別名
let http404ErrorName = (errorCode:404,message:"Not Found")
let errorMessage = http404ErrorName.message  // "Not Found"

五月褥、可選類型(optionals)

*** 在OC中我們定義一個暫時不用的變量的時候可以這樣:Int a ,NSString str = nil.但是在swift中不允許這樣弛随,因為swift是強類型語言,nil在swift中也是一種類型宁赤,類型不一樣是不可以賦值的舀透,所以推出了一種可選類型,在swift中規(guī)定:在創(chuàng)建對象時决左,對象中的任何屬性都必須要有一個明確的初始化值** *

Swift 的 Int 類型有一種構(gòu)造器愕够,作用是將一個 String 值轉(zhuǎn)換成一個 Int 值。然而佛猛,并不是所有的字符串都可以轉(zhuǎn)換成一個整數(shù)惑芭。字符串 "123" 可以被轉(zhuǎn)換成數(shù)字 123 ,但是字符串 "hello, world" 不行继找。

“l(fā)et possibleNumber = "123"
let convertedNumber = Int(possibleNumber)
// convertedNumber 被推測為類型 "Int?"遂跟, 或者類型 "optional Int”

因為該構(gòu)造器可能會失敗,所以它返回一個可選類型(optional)Int婴渡,而不是一個 Int幻锁。一個可選的 Int 被寫作 Int? 而不是 Int。問號暗示包含的值是可選類型边臼,也就是說可能包含 Int 值也可能不包含值哄尔。(不能包含其他任何值比如 Bool 值或者 String 值。只能是 Int 或者什么都沒有柠并。)

// 你可以給可選變量賦值為nil來表示它沒有值:
serverResponseCode = nil
// serverResponseCode 現(xiàn)在不包含值”

** # if語句和強制解析 **
你可以使用 if 語句和 nil 比較來判斷一個可選值是否包含值岭接。你可以使用“相等”(==)或“不等”(!=)來執(zhí)行比較富拗。

如果可選類型有值,它將不等于 nil:

if convertedNumber != nil {
    print("convertedNumber contains some integer value.")
}
// 輸出 "convertedNumber contains some integer value.

確定可選類型確實包含值之后鸣戴,你可以在可選的名字后面加一個感嘆號(!)來獲取值啃沪。這個驚嘆號表示“我知道這個可選有值,請使用它葵擎×掳ⅲ”這被稱為可選值的強制解析

if convertedNumber != nil {
    print("convertedNumber has an integer value of \(convertedNumber!).")
}
// 輸出 "convertedNumber has an integer value of 123.

# 可選綁定
*** 使用可選綁定(optional binding)來判斷可選類型是否包含值,如果包含就把值賦給一個臨時常量或者變量酬滤∏┎停可選綁定可以用在 if 和 while 語句中,這條語句不僅可以用來判斷可選類型中是否有值盯串,同時可以將可選類型中的值賦給一個常量或者變量 ** *

if let actualNumber = Int(possibleNumber) {
    print("\'\(possibleNumber)\' has an integer value of \(actualNumber)")
} else {
    print("\'\(possibleNumber)\' could not be converted to an integer")
}
// 輸出 "'123' has an integer value of 123

這里面其實進行了兩步操作:1.先判斷possibleNumber 是不是nil氯檐,是的話就不執(zhí)行大括號里的語句。2.不空的話對possibleNumber 進行解包賦值 .但是這種的話每次都得起一個別名

** # ??(空合運算符)**
**空合運算符(a ?? b)將對可選類型 a 進行空判斷体捏,如果 a 包含一個值就進行解封冠摄,否則就返回一個默認值 b。表達式 a 必須是 Optional 類型几缭。默認值 b 的類型必須要和 a 存儲值的類型保持一致河泳。 **

let nickName :String? = nil
let fullName :String = "Harry"
// 如果可選值nickName是nil的話可以使用默認值來代替.??用來提供一個默認值
let inforGrreting = (nickName ?? fullName)

字符串和字符(字符串是值類型)

1.初始化
初始化有兩種方式

//1.使用初始化方法初始化
var anotherEmptyString = String()   
//2. 使用字符串常量初始化 
var str = "Hello, playground"
var str0 = ""   //初始化一個空字符串  

可以通過檢查其Bool類型的isEmpty屬性來判斷該字符串是否為空:

if emptyString.isEmpty {
    print("Nothing to see here")
}
// 打印輸出:"Nothing to see here

2.字符串的操作(增刪改)

// 1.字符串拼接
var s = "我是原始的"   // "我是原始的"
let s0 = s + "\n 我是通過+追加的字符串" // "我是原始的\n 我是通過+追加的字符串"
s += s0  //通過賦值運算符(+=)將一個字符串添加到一個已經(jīng)存在字符串變量上
s.append("\n 我是append拼接的字符串")  // "我是原始的我是原始的\n 我是通過+追加的字符串\n 我是append拼接的字符串"
// 2. 計算字符數(shù)量
// 如果想要獲得一個字符串中 Character 值的數(shù)量,可以使用字符串的 characters 屬性的 count 屬性

// 3. 訪問和修改字符串
// 關(guān)鍵字 string.Index ,對應(yīng)著字符串中的每一個character 的位置
// 使用 startIndex 屬性可以獲取一個 String 的第一個 Character 的索引年栓。使用 endIndex 屬性可以獲取最后一個 C haracter 的后一個位置的索引拆挥。因此, endIndex 屬性不能作為一個字符串的有效下標某抓。如果 String 是空串纸兔, artIndex 和 endIndex 是相等的
let sss = "hello world"    // "hello world"
// .endIndex.predecessor ,獲取最后一個字符,swift3中用的是index(befor:)
sss[sss.startIndex]  // "h"
sss[sss.index(after: sss.startIndex)]   //  "e"
sss[sss.index(before: sss.endIndex)]  // "d"
// 通過下標語法獲取
let index = sss.index(sss.startIndex, offsetBy: 7)   // 7
let indexStr = sss[index]  // "o"

// 截取字符串
var  strNum = "12>345</6"
//let startIndex = strNum.range(of: ">")?.lowerBound
//let startIndex0 = strNum.characters.index(of: ">")
//let endIndex0 = strNum.characters.index(of: "<")
//// “endIndex屬性可以獲取最后一個Character的后一個位置的索引”,這里是upperBound
//let end = strNum.range(of: "</")?.upperBound
//let endIndex = strNum.index(before: end!)
//
//let range = Range(uncheckedBounds: (startIndex0!,endIndex))
//let newS = strNum.substring(with: range)

let startIndex = strNum.range(of: ">")?.upperBound
let endIndex = strNum.range(of: "</")?.lowerBound
let range = Range(uncheckedBounds: (startIndex!,endIndex!))
let newS = strNum.substring(with: range)


// 插入和刪除
// 調(diào)用 insert(_:atIndex:) 方法可以在一個字符串的指定索引插入一個字符否副,調(diào)用 insert(contentsOf:at:) 方法可以在一個字符串的指定索引插入一個段字符串
var welcome = "hello"
welcome.insert("!", at: welcome.endIndex)
// welcome 變量現(xiàn)在等于 "hello!"
 
// 調(diào)用 remove(at:) 方法可以在一個字符串的指定索引刪除一個字符汉矿,調(diào)用 removeSubrange(_:) 方法可以在一個字符串的指定索引刪除一個子字符串。

“welcome.remove(at: welcome.index(before: welcome.endIndex))
// welcome 現(xiàn)在等于 "hello there"
 
let range = welcome.index(welcome.endIndex, offsetBy: -6)..<welcome.endIndex
welcome.removeSubrange(range)
// welcome 現(xiàn)在等于 "hello”

welcome.insert(contentsOf:" there".characters, at: welcome.index(before: welcome.endIndex))
// welcome 變量現(xiàn)在等于 "hello there!

// 4 . 遍歷字符串
for character in label.characters
{
    print(character)
}

// 5.字符串插值
let multiplier = 3
let message = "\(multiplier) times 2.5 is \(Double(multiplier) * 2.5)"
// message is "3 times 2.5 is 7.5"
* multiplier作為\(multiplier)被插入到一個字符串常量量中备禀。 當創(chuàng)建字符串執(zhí)行插值計算時此占位符會被替換為multiplier實際的值 *

// 6. 比較字符串
// 字符串/字符可以用等于操作符(==)和不等于操作符(!=)
let quotation = "We're a lot alike, you and I."
let sameQuotation = "We're a lot alike, you and I."
if quotation == sameQuotation {
    print("These two strings are considered equal")
}
// 打印輸出 "These two strings are considered equal

集合類型

** * Swift 語言提供Arrays洲拇、Sets和Dictionaries三種基本的集合類型用來存儲集合數(shù)據(jù)。數(shù)組(Arrays)是有序數(shù)據(jù)的集曲尸。集合(Sets)是無序無重復(fù)數(shù)據(jù)的集呻待。字典(Dictionaries)是無序的鍵值對的集。** *

一队腐、數(shù)組

1.初始化方法

// 聲明數(shù)組的方式常用的是下面兩種
//1. 聲明一個不可變數(shù)組
let array = ["hhh","xixiix","gagaga"]
//2.聲明一個空的可變數(shù)組 ,用初始化方法
var arrayM = [String]()  // 或者 var arrayM = Array <String>() 這種寫法看著很麻煩,不常用

2.可變數(shù)組的基本操作(增刪改)

//1. 添加元素
arrayM.append("wawo")
arrayM.append("nihao")
arrayM.append("hello")
//2. 刪除元素
arrayM.remove(at: 0)
print(arrayM)
//3. 取出元素并附新值

arrayM[0] = "very good"
//4. 遍歷數(shù)組
//4.1 通過下標來遍歷
for i in 0..<array.count
{
    print(array[i])
}
//4.2 直接遍歷
for str in array
{
    print(str)
}
// 4.3 只遍歷前兩個元素
for name in array[0..<2]
{
    print(name)
}
//5. 數(shù)組合并
let addArray = arrayM + array  // 只有相同類型的數(shù)組可以相加

二奏篙、字典

1.初始化

var dict = ["name":"hello","age":20] as [String : Any];
print(dict["age"])
// 創(chuàng)建一個新的字典柴淘,用初始化方法
var myDictionary = [String:Any]()

2.可變字典的操作

//6.1.1添加元素
myDictionary["name"] = "petter"
myDictionary["weight"] = 60
myDictionary["height"] = 1.88
myDictionary
//6.1.2刪除元素
myDictionary.removeValue(forKey: "weight")
myDictionary
//6.1.3獲取元素迫淹,修改元素
myDictionary["name"] = "Job"
//如果字典里面沒有對應(yīng)的key會在字典里新添加一對鍵值對
myDictionary["sex"] = "male"
myDictionary
//6.1.4遍歷字典
//遍歷所有的key
for key in myDictionary.keys
{
    
}
//遍歷所有的value
for value in myDictionary.values
{
    
}
//遍歷所有的鍵值對
for (key,value) in myDictionary
{
    
}
//5.1.5合并  字典即使類型一致也不能進行相加合并
var dict1 = ["name":"peter","age":20] as [String:Any]
let dict2 = ["sex":"male","height":188] as [String:Any]

for (key,value) in dict2
{
    dict1[key] = value
}
dict1

控制流

** * Swift提供了多種流程控制結(jié)構(gòu),包括可以多次執(zhí)行任務(wù)的while循環(huán)为严,基于特定條件選擇執(zhí)行不同代碼分支的if敛熬、guard和switch語句,還有控制流程跳轉(zhuǎn)到其他代碼位置的break和continue語句第股。還提供了for-in循環(huán)应民,用來更簡單地遍歷數(shù)組(array),字典(dictionary)夕吻,區(qū)間(range)诲锹,字符串(string)和其他序列類型。 ***

1.for in 循環(huán)

let interestingNumbers = [
    "one":[1,2,3,4],
    "two":[0,-1,5],
    "three":[9,10,4,29]
];
var largest = 0
for(kind,numbers) in interestingNumbers
{
    for number in numbers    // swift 的for in 不加括號
    {
        if(number > largest)
        {
            largest = number
        }
    }
}
print(largest)

2.While 循環(huán)
Swift 提供兩種while循環(huán)形式:

****while循環(huán)涉馅,每次在循環(huán)開始時計算條件是否符合归园;***
****repeat-while循環(huán),每次在循環(huán)結(jié)束時計算條件是否符合稚矿。***

var num = 1
while num < 3
{
    num = num * 2
}
print(num)   // 打印結(jié)果  : 4
// do while(swift中將do 改成了 repeat) 循環(huán)放在結(jié)尾保證循環(huán)至少被執(zhí)行一次
var n = 1
repeat {
    n = n * 2
}while n < 3
print(n)  // 打印結(jié)果: 4

** 3.switch **

// switch 語句 庸诱,最基本的用法
let color = "red color"
switch color{
    case "blue":
    print("the color is blue")
    case "white":
    print("the coloe is white")
    // 這個會將后綴含有color 的結(jié)果賦給x
    case let x where x.hasSuffix("color"):
        print("the color is \(x)")
    default:
        print("no color")
}

** #匹配區(qū)間**

Paste_Image.png
// switch 也可以使用元組
// 比如 一個坐標系中的點,X軸是-2到2晤揣,Y軸也是-2到2桥爽,判斷某個點(x,y),使用(Int,Int)類型的元組
let somePoint = (1,1)
switch somePoint {
case (0,0):
    print("is a origin point")
case (_,0): // “使用下劃線(_)來匹配所有可能的值”
    print("\(somePoint.0) 在X 軸上")
case (0,_):
    print("(\0,\(somePoint.1)) 在Y軸上")
case (-2...2,-2...2):
    print("(\(somePoint.0),\(somePoint.1) 在這個坐標系里面)")
default:
    print("不在當前坐標系范圍內(nèi)")
}
// case語句可以用where語句來判斷額外的條件
let AnotherPoint = (-1,1)
switch AnotherPoint {
case let(x,y) where x == y:
    print("x= y")
case let(x,y) where x == -y:
    print("x==-y")
case let(x,y):  // 這里用的是值綁定,“case 分支的模式允許將匹配的值綁定到一個臨時的常量或變量昧识,這些常量或變量在該 case 分支里就可以被引用了” “這三個 case 都聲明了常量x和y的占位符钠四,用于臨時獲取元組anotherPoint的一個或兩個值” “case let(x, y)聲明了一個可以匹配余下所有值的元組。這使得switch語句已經(jīng)完備了滞诺,因此不需要再書寫默認分支形导。”
    print("the point is (\(AnotherPoint.0),\(AnotherPoint.1))")
}

#復(fù)合匹配
***當多個條件可以使用同一種方法來處理時习霹,可以將這幾種可能放在同一個case后面朵耕,并且用逗號隔開。當case后面的任意一種模式匹配的時候淋叶,這條分支就會被匹配阎曹。并且,如果匹配列表過長煞檩,還可以分行書寫 ***

// switch 中的控制轉(zhuǎn)移語句 (continue, break , fallthrough ,return)
// continue  continue語句告訴一個循環(huán)體立刻停止本次循環(huán)迭代处嫌,重新開始下次循環(huán)迭代
// 下面把一串小寫字母中的元音字母和空格字符移除
let SomeCharacter = "great wall is very good"
var resultCharacter = ""
for character in SomeCharacter.characters
{
   switch character {
   case "a","e","i","o","u"," ":
       continue
   default:
       resultCharacter.append(character)
   }
}
print(resultCharacter)
/*
“在上面的代碼中,只要匹配到元音字母或者空格字符斟湃,就調(diào)用continue語句熏迹,使本次循環(huán)迭代結(jié)束,從新開始下次循環(huán)迭代凝赛。這種行為使switch匹配到元音字母和空格字符時不做處理注暗,而不是讓每一個匹配到的字符都被打印坛缕。”
*/

// Break break會立即結(jié)束整個控制流的執(zhí)行
// Fallthrough(貫穿)  在OC 中不加break會貫穿捆昏,swift中不加break也不會貫穿赚楚。如果需要貫穿就加上這個關(guān)鍵字

** #提前退出(guard)**
*** 像if語句一樣,guard的執(zhí)行取決于一個表達式的布爾值骗卜。我們可以使用guard語句來要求條件必須為真時宠页,以執(zhí)行g(shù)uard語句后的代碼。不同于if語句寇仓,一個guard語句總是有一個else從句举户,如果條件不為真則執(zhí)行else從句中的代碼。 ***

函數(shù)

1.格式

函數(shù)名 + (參數(shù))-> 返回值類型
func greet(name:String , lunch:String) -> String {
    return "Hello \(name) lunch is \(lunch)"
}
greet(name: "steve", lunch: "cookie")    //  "Hello steve lunch is cookie"
greet(name: "job", lunch: "beef")   //  "Hello job lunch is beef"

2.參數(shù)與返回值

// 無參數(shù)
func sayHelloWorld() -> String {
    return "hello, world”
}
print(sayHelloWorld())
// 打印 "hello, world”

// 多參數(shù)
func sayHello(name:String ,message:String){
    print("\(name) 說 \(message)")
}
sayHello(name: "job", message: "我是job焚刺,很高興認識你")
// 打印 "job 說 我是job敛摘,很高興認識你\n"

// 沒有返回值的函數(shù)
func test(hello:String) {
    "hello \(hello)"
}
test(hello: "jerry") 
// 打印 "hello jerry"

// 返回多個值
func math (numbers:[Int])->(max:Int,min:Int,sum:Int)
{
    var min = numbers[0]
    var max = numbers[0]
    var sum = 0
    for number in numbers {
        if number < min {
            min = number
        }else if number > max
        {
            max = number
        }
        sum += number
    }
    return (max, min,sum)
}
math(numbers: [2,4,8,7])
// 打印   (.0 8, .1 2, .2 21)

// 帶有可變個數(shù)參數(shù)的函數(shù)  “通過在變量類型名后面加入(...)的方式來定義可變參數(shù)”
/*
 “注意: 一個函數(shù)至多能有一個可變參數(shù),而且它必須是參數(shù)表中最后的一個乳愉。這樣做是為了避免函數(shù)調(diào)用時出現(xiàn)歧義兄淫。”
  */
func sumFunction(numbers:Int...)->Int{
    var sum = 0
    for number in numbers {
        sum += number
    }
    return sum
}
sumFunction()   // 打印   0
sumFunction(numbers: 1,2,3)  // 打印   6


// 默認參數(shù)值,可以在函數(shù)體中為每個參數(shù)定義一個默認值蔓姚。當默認值被定以后捕虽,調(diào)用這個函數(shù)時可以忽略這個參數(shù)
func jion(s1:String,s2:String,joiner:String = " ")->String
{
    return s1 + joiner + s2
}
jion(s1: "hello", s2: "world", joiner: "-")      // 打印  "hello-world"
jion(s1: "hello", s2: "world") // “當這個函數(shù)被調(diào)用時,如果 joiner 的值沒有被指定坡脐,函數(shù)會使用默認值(" ")”        // 打印     "hello world"

// 函數(shù)參數(shù)默認是常量泄私,在swift3以前可以在參數(shù)列表中加var 來修飾,swift 3之后去除了這種寫法备闲,需要寫成下面這樣
func exchangeFunc ( num1: Int , num2: Int)
{
    var num1 = num1
    var num2 = num2
    let temp = num1
    num1 = num2
    num2 = temp
    print("num1:\(num1),num2:\(num2)")  
}
exchangeFunc(num1: 3, num2: 9)   //  打印 "num1:9,num2:3\n"


//輸入輸出參數(shù)  inout
// 變量參數(shù) 晌端,只能在函數(shù)體內(nèi)被修改,(默認是值傳遞)如果想要在一個函數(shù)調(diào)用結(jié)束后使修改的結(jié)果還存在恬砂,就應(yīng)該吧這個參數(shù)定義為輸入輸出參數(shù) inout 關(guān)鍵字修飾
var n1 = 3
var n2 = 8
func exchangeFunc1(num1:inout Int,num2:inout Int)
{
    let temp = num1
    num1 = num2
    num2 = temp
}
exchangeFunc1(num1:&n1, num2:&n2) // 調(diào)用的時候默認就會加上&取地址符
print("num1:\(n1),num2:\(n2)")   //  打印  "num1:8,num2:3”

// 函數(shù)類型  每個函數(shù)都有特定的函數(shù)類型咧纠,由函數(shù)的參數(shù)類型和返回類型組成
// 比如上面的exchangeFunc函數(shù)的類型是(Int,Int)-> Int ,沒有參數(shù)和返回值得類型是()->().(在swift中Void與空的元組是一樣的)
//  函數(shù)類型的使用 ,定義一個類型為函數(shù)的常量或者變量
func addTowm (a:Int,b:Int)->Int{
    return a+b
}
var myCustomeFunc :(Int,Int)->Int = addTowm
myCustomeFunc(3,6)

//同樣函數(shù)類型也可以用類型推斷泻骤,根據(jù)結(jié)果推斷其函數(shù)類型
var myCustomeFunc1 = addTowm
//有相同匹配類型的不同函數(shù)也可以被賦值給同一個變量

// 函數(shù)作為返回值(這里也是用了函數(shù)類型作為返回類型)

func returnFunc() -> ((Int) -> Int) {
    func add (number:Int)->Int{
        return number + 10
    }
    return add
}
let funcBack = returnFunc()
funcBack(10)     //  打印  20

// 函數(shù)作為參數(shù)傳入另一個函數(shù)(這里是將函數(shù)類型作為參數(shù))
func functionParameter(numbers:[Int],condition:(Int)->Bool)->Bool{
    for _num in numbers {
        if condition(_num) {
            return true
        }
    }
    return false
}
func conditionFunc (number:Int)->Bool{
    return number < 10
}
functionParameter(numbers: [2,16], condition: conditionFunc)   // 打印 true

閉包

***閉包和函數(shù)類似漆羔,可以理解成函數(shù)的簡寫形式,其本質(zhì)是匿名的可執(zhí)行代碼塊狱掂。在該代碼塊中演痒,封裝了其所處環(huán)境的所有狀態(tài)。在閉包之前聲明的所有變量和常量都可以被它捕獲趋惨。 函數(shù)和閉包都是引用類型 ,閉包表達式語法可以使用常量鸟顺、變量和 inout 類型作為參數(shù),不能提供默認值。也可以在參數(shù)列表的最后使用可 變參數(shù)器虾。元組也可以作為參數(shù)和返回值诊沪。 ***

** 1.格式**

(參數(shù))-> (返回值類型)
//  閉包表達式語法有如下一般形式:{(參數(shù)名1:類型, 參數(shù)名2:類型) -> 返回值類型 in 功能實現(xiàn) }
/*
{ (parameters) -> returnType in
    statements
}
 */

2.使用

let addClosure = { (num1:Int, num2:Int) -> Int in 
    return num1 + num2
}
let minusClosure = { (num1:Int, num2:Int) -> Int in 
    return num1 - num2
}

3.將閉包作為函數(shù)的輸入?yún)?shù)

func calc(num1:Int, num2:Int, closure:(Int, Int) ->Int) -> Int { 
    return closure(num1, num2)
}

4.調(diào)用函數(shù)养筒,閉包作為參數(shù)傳入

let result1 = calc(100, num2: 200, closure: addClosure)  //  300
let result2 = calc(100, num2: 200, closure: minusClosure)  // -100

枚舉

1.枚舉語法
使用enum關(guān)鍵詞來創(chuàng)建枚舉并且把它們的整個定義放在一對大括號內(nèi):
多個成員值可以出現(xiàn)在同一行上,用逗號隔開

enum SomeEnumeration {
    // 枚舉定義放在這里
}

2.枚舉的使用

enum MyEnumeration{
    case West,North,South,East
}
var enumHead = MyEnumeration.West
//enumHead = .East
enumHead = .South

switch enumHead{
case .South:
    print("yes ,you are good ")
case .West:
    print("what out of penguins")
case .East:
    print("hhh ,is the East")
case .North:
    print("is the North")
}
//  打印結(jié)果   "yes ,you are good \n"

類和對象

類是引用類型端姚,(相當于是只是引用指針指向)(=== 等價于 表示兩個類類型的常量或變量引用同一個實例 , == 等于 表示兩個實例的值相等或相同)
1.類的定義

class shape:NSObject{
    //屬性
    // 存儲屬性
    var numberOfSide = 3
    var width = 10
    var height = 30
    
    //定義計算屬性
    var size :Int{
        return width * height
    }
    // 類屬性  通過類名進行訪問
    static var id = 8
    let type = "shape"
    // 通過重寫父類的kvc方法挤悉,在用kvc 設(shè)置類的屬性的時候可以傳入類中不存在鍵值對
    override func setValue(_ value: Any?, forUndefinedKey key: String) {
        
    }
    //swift中調(diào)用方法和屬性可以不加self
    func subDescription() -> String {
        return "the shape numberOfSide is \(numberOfSide)"
    }
    func author(name:String) -> String {
        return "the author is \(name)"
    }
}

2.對象--類的實例化

var shapeClass = shape() //初始化子類

3.對象的屬性設(shè)置與訪問

shapeClass.numberOfSide = 6 //1. 給類的存儲屬性賦值渐裸,直接賦值
shapeClass.setValuesForKeys(["numberOfSide":10]) // 2.通過kvc給類的存儲屬性賦值
shapeClass.setValue(20, forKey: "numberOfSide")
print(shapeClass.numberOfSide)
shapeClass.setValuesForKeys(["numberOfSide":30,"name":"petter"]) // 這里就不會報錯,因為上面重寫了setValue(_ value: Any?, forUndefinedKey key: String)方法
var shapeDescription = shapeClass.subDescription()
var shapeAuthor = shapeClass.author(name: "Ben")
var type = shapeClass.type

結(jié)構(gòu)體

// 結(jié)構(gòu)體結(jié)構(gòu)體是被通過復(fù)制的方式在代碼中傳遞装悲,不使用引用計數(shù)昏鹃。 
// 結(jié)構(gòu)體和類的定義方式相似,關(guān)鍵字是struct開頭
// 結(jié)構(gòu)體和枚舉都是值類型(值類型被賦予一個變量诀诊、常量或者被傳遞給一個函數(shù)的時候洞渤,其值會被拷貝)

class SomeClass { // 聲明一個類
    var subStruct = SomeStruct()
    var name:String?
    
}

struct SomeStruct{// 聲明一個結(jié)構(gòu)體
    var width = 0
    var height = 0
}

// 結(jié)構(gòu)體和類聲明實例的方式也很相似,都采用的是構(gòu)造器語法
 let subClass = SomeClass()
 let subStruct1 = SomeStruct()

// 在swift 中可以直接設(shè)置結(jié)構(gòu)體屬性的子屬性的值,在OC 中是不允許的属瓣,需要先定義一個中間變量载迄,比如設(shè)置frame
subClass.subStruct.width = 640
print("subStruct width is now \(subClass.subStruct.width)")

// 成員逐一構(gòu)造器,用于初始化新結(jié)構(gòu)體實例中成員的屬性抡蛙。類實例沒有默認的成員逐一構(gòu)造器
let newSubStruct = SomeStruct(width:200,height:300)

// 關(guān)于值類型舉個例子

// 定義一個結(jié)構(gòu)體實例
let cnima = SomeStruct(width:1280,height:720)
// 再聲明一個HD變量护昧,將cnima的值賦給他
var HD = cnima
//修改HD的width屬性值
HD.width = 2480
print("now cnima.width is \(cnima.width)") // 打印發(fā)現(xiàn)還是1280,并未受到影響粗截,因為cnima 是一個結(jié)構(gòu)體的實例惋耙,所以HD其實就是一個cnima的拷貝副本,在幕后他們是完全不同的實例


// 枚舉
enum testEnum{
    case west,east,south
}
var currentDirectin = testEnum.west
var memberDirection = currentDirectin
memberDirection = testEnum.south
if currentDirectin == .west {
    print("currentDirection still is west")
}

參考
Swift3.0基礎(chǔ)語法快速入門
The Swift Programming Language 中文版
Wiki
移動開發(fā)
iOS

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末熊昌,一起剝皮案震驚了整個濱河市绽榛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌婿屹,老刑警劉巖灭美,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異选泻,居然都是意外死亡冲粤,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門页眯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來梯捕,“玉大人,你說我怎么就攤上這事窝撵】耍” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵碌奉,是天一觀的道長短曾。 經(jīng)常有香客問我寒砖,道長,這世上最難降的妖魔是什么嫉拐? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任哩都,我火速辦了婚禮,結(jié)果婚禮上婉徘,老公的妹妹穿的比我還像新娘漠嵌。我一直安慰自己,他們只是感情好盖呼,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布儒鹿。 她就那樣靜靜地躺著,像睡著了一般几晤。 火紅的嫁衣襯著肌膚如雪约炎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天蟹瘾,我揣著相機與錄音圾浅,去河邊找鬼。 笑死热芹,一個胖子當著我的面吹牛贱傀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播伊脓,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼府寒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了报腔?” 一聲冷哼從身側(cè)響起株搔,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎纯蛾,沒想到半個月后纤房,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡翻诉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年炮姨,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碰煌。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡舒岸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出芦圾,到底是詐尸還是另有隱情蛾派,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站洪乍,受9級特大地震影響眯杏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜壳澳,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一岂贩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧钾埂,春花似錦河闰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瞪慧。三九已至髓考,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間弃酌,已是汗流浹背氨菇。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留妓湘,地道東北人查蓉。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像榜贴,于是被迫代替她去往敵國和親豌研。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

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

  • 花了周末的時間翻譯raywenderlich.com的Swift編碼規(guī)范(傳送門)唬党, 原文是針對寫作時Swift代...
    豆志昂揚閱讀 7,602評論 2 43
  • 關(guān)于 Swift 重要這個文檔所包含的準備信息, 是關(guān)于開發(fā)的 API 和技術(shù)的鹃共。這個信息可能會改變, 根據(jù)這個文...
    無灃閱讀 4,286評論 1 27
  • 86.復(fù)合 Cases 共享相同代碼塊的多個switch 分支 分支可以合并, 寫在分支后用逗號分開。如果任何模式...
    無灃閱讀 1,354評論 1 5
  • 前言 Swift驶拱,蘋果于2014年WWDC(蘋果開發(fā)者大會)發(fā)布的新開發(fā)語言霜浴,可與Objective-C共同運行于...
    踐行者_Leng閱讀 762評論 2 1
  • 看過很多電視劇税迷,國產(chǎn)劇永丝,美劇,我發(fā)現(xiàn)一個規(guī)律翁狐,國產(chǎn)劇中但凡女豬腳發(fā)生點啥想不開了类溢,男豬腳絕對瀟灑的側(cè)臉,說一句我能...
    灰熊貓閱讀 337評論 0 0