swift學習 (數據類型+函數和閉包)

無意間看到自己以前學習swift的筆記,從近兩年蘋果的發布會,可以看出蘋果推動swift的決心,OC更換為swift也是未來發展的趨勢,想起當初自己鉆研學習swift的痛苦的情景,現在把它們整理出來并與現在最新的swift結合以供初學者使用,讓初學者少走彎路。有時間會陸續整理后面知識的學習筆記。


字符串

字符串介紹
  • String 是一個結構體
  • String 的性能比 NSString 的性能要高
  • String 目前具有了絕大多數 NSString 的功能
  • String 和 NSString 可以無縫轉換
  • 在 Swift 中絕大多數的情況下,推薦使用 String 類型
字符串定義
  • 用 var 定義一個可變字符串
  • 用 let 定義一個不可變的字符串

//定義一個空的字符串

let str = ""
let str1 = String()

//定義字符串并賦初值

let str3 = "hello world"

//用 var 定義可變字符串,用 let 定義不可變字符串

var mutableStr = "string can be changed"

//刪除第一個字符 s

mutableStr.remove(at: mutableStr.startIndex)
print(mutableStr)
字符串拼接

字符串拼接可以真接用加號
//: 字符串拼接

let ustr = "hello, world"
let ustr2 = "I hove you"

//連接字符串可以直接用 + 和 +=

var ustr3 = ustr + ustr2
ustr3 += "very good"

//如果拼接的字符串為可選值

var ostr: String?
ustr3 += ostr ?? "no value"

//字符串和變量拼接

var name = "老王"
let str6 = "他正準備打開家門,發現 \\(name)從里面出來了"

//: 字符串的格式化
//媽媽再也不用擔心我用 stringWithFormat

let strb = "字符串\(stra)連接整型\(a)和浮點型\(f)"
var h = 5
var m = 6
var s = 3
let time = String(format: "%02d:%02d:%02d", h, m , s)
let time1 = String(format: "%02d:%02d:%02d",arguments: [h, m , s])
字符串比較

swift 中用 == 和 != 來比較兩個字符串
oc 中用 equalToString 來比較兩個字符串
//比較字符串

let cstr = "hello"
let cstr2 = "world"
let cstr3 = "hello"
if cstr == cstr3 {
print("相等")
}
if cstr2 != cstr3 {
print("不相等")
}
判斷前后綴
var str7 = "ni hao ma"
let count = str7.utf8.count
let prefix = str7.hasPrefix("ni")
let suffix = str7.hasSuffix("ma")

數組

//數組的創建
//用var創建一個可變的數組, 用let創建一個不可變的數組

var array = ["dog", "cat", "pig"]
var emptyArr: [String] = []
array.append("fish")

//用初始化的方式, 來創建數組, 一定要指定類型

var array2: [String] = Array()

//數組的遍歷

for item in array {
print(item)
}

//遍歷同時拿到index

for item in array.enumerated() {
print("\(item.offset): \(item.element)")

}

//倒序遍歷

for item in array.reversed() {
print(item)
}

//數組的操作
//數組的合并

var array3 = ["goat", "snake"]
var array4 = ["dog", "cat", "pig"]
var array5 = array3 + array4

//刪除元素

let removed = array5.remove(at: 0)

//修改

array5[0] = "sheep"

//和oc的數組互轉

let ocArray = array5 as NSArray
ocArray.subarray(with: NSMakeRange(0, 3))

字典

//定義一個字典
//用var定義一個可變的字典, 用let定義一個不可變的字典

var dict = ["first": "dog", "second": "cat"]

//定義一個空的字典

var dict1: [String: String] = Dictionary()
var dict2: [String: String] = [:]

//遍歷字典

for (k, v) in dict {
print("key: \(k), value: \(v)")
}

//字典的操作, 增刪查改, 字典的操作都是圍繞key值做操作

//增

dict["third"] = "pig"

//刪

dict["second"] = nil

//查:從字典中取出的值,是一個可選值, 使用的時候最好做一次可選綁定

let first = dict["first"]

//改

dict["first"] = "duck"
print(dict)

函數

//用func創建一個函數
//函數名后面接小括號, 小括號不能省略
//小括號里面放參數, 參數必須指定類型, 多個參數用逗號隔開
//如果沒有返回值, 返回值的部分可以省略

func add(a: Int, b: Int) -> Int {
return a + b
}

//函數沒有返回值,本質上返回一個空的元組

func addOne(a: Int, b: Int) {
print(a + b)
}

func addTwo(a: Int, b: Int) -> () {
print(a + b)
}

func addThree(a: Int, b: Int) -> Void {
print(a + b)
}

//沒有參數,沒有返回值

func methodOne () {
print("hello, class seven")
}

methodOne()

//有參數, 沒有返回值
func methodTwo (a: Int, b: Int) {
print(a + b)
}
methodTwo(a: 5, b: 5)
//有參數有返回值, 返回的值和返回值類型必須保持一至

func methodThree (a: Int, b: Int) -> Int {
return a + b
}

let result = methodThree(a: 5, b: 5)

let method = methodTwo

函數的參數

//默認情況下, swift會給每個參數加一個和形參一樣的外部參數名
//外部參數名, 就是對參數做解釋說明的字符串
//外部參數名, 在調用的時候, 必須寫

func add(a: Int, b: Int) -> Int {
return a + b
}

add(a: 5, b: 10)

//也可以自定義外部參數名

func addOne(first a: Int,second b: Int) -> Int {
return a + b
}
addOne(first: 5, second: 10)

//也可以忽略外部參數名
//使用忽略運算符忽略外部參數名

func addTwo(_ a: Int,_ b: Int) -> Int {
return a + b
}
addTwo(5, 10)

函數的默認參數

//swift語言函數的參數可以設默認值
//如果參數有默認值,則該參數可傳可不傳

func add(a: Int, b: Int = 10) -> Int {
return a + b
}

add(a: 5)
add(a: 5, b: 156)

 func customLabel (title: String, fontSize: CGFloat = 13,   alignment: NSTextAlignment = .left, numerOfLines: Int = 0) -> UILabel {
let label = UILabel()
label.text = title
label.font = UIFont.systemFont(ofSize: fontSize)
label.textAlignment = alignment
label.numberOfLines = numerOfLines

    return label
}

let label0 = customLabel(title: "label", fontSize: 13, alignment: .left, numerOfLines: 0)

let lable = customLabel(title: "label")

閉包

//閉包是一個匿名的函數塊
//閉包被完整地包裹在大括號里面
//閉包的調用方式和函數一樣
//閉包可以做為參數傳遞,也可以做為返回值返回

//沒有參數,沒有返回值

func methodOne () {
print("hello, class seven")
}

methodOne()

//有參數, 沒有返回值

func methodTwo (a: Int, b: Int) {
print(a + b)
}
methodTwo(a: 5, b: 5)
//有參數有返回值, 返回的值和返回值類型必須保持一至
func methodThree (a: Int, b: Int) -> Int {
return a + b
}    
閉包的定義和調用
//沒有參數,沒有返回值的閉包
let clousureOne = {
print("hello, class seven, seven")
}

clousureOne()

 //有參數, 沒有返回值
//參數和執行語句都寫在大括號里面, 用in隔開
//閉包沒有外部參數名
let clousureTwo = {
(a: Int, b: Int) in
print(a + b)
}

clousureTwo(5, 12)

//有參數, 有返回值
let clousureThree = {
(a: Int, b: Int) -> Int in
return a + b
}

let result = clousureThree(5, 240)

閉包的使用

需求::

下載一部 av, 完成后更新 UI 提示, 要求用閉包實現
實現::

  1. 新建一個函數,實現下載的功能
  2. 新建一個閉包,更新 ui
  3. 將閉包作為函數傳遞,下載成功后,下載函數中調用更新 UI 的閉包,功能實現

class ViewController: UIViewController {

var activity: UIActivityIndicatorView?

override func viewDidLoad() {
    super.viewDidLoad()

    let label = UILabel(frame: CGRect(x: 20, y: 40, width: 400, height: 30))
    self.view.addSubview(label)

    activity = UIActivityIndicatorView(activityIndicatorStyle: .Gray)
    self.view.addSubview(activity!)
    activity!.center = self.view.center

    let downloadAVFinished = {
        (money:  String) in
        print(money)
        label.text = "我下載了了\(money)rmvb,快來和我做朋友吧"
    }

    dowloadAV(downloadAVFinished)

    activity!.startAnimating()
}

func dowloadAV (block: (String)->()) {

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { () -> Void in

        let time: NSTimeInterval = 3
        let delay = dispatch_time(DISPATCH_TIME_NOW, Int64(time*Double(NSEC_PER_SEC)))
        dispatch_after(delay, dispatch_get_main_queue()) { () -> Void in
            let av = "蒼井空"
            block(av)
            self.activity!.stopAnimating()
        }
    }
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}
}

尾隨閉包

  • 如果閉包代碼塊作為函數的最后一個參數
  • 當函數調用時,可以將閉包代碼塊寫在參數的小括號的外面
  • 尾隨閉包可以增強函數的可讀性
  • 注意: 如果函數只需要閉包表達式一個參數,當您使用尾隨閉包時,您甚至可以把()省略掉。
//定義一個閉包
let closure = {
(a: Int) -> Int in 
return a + 5
}

    //定義一個函數,第二個參數為閉包
func method (a: Int, sum: (Int)->(Int))->Int{
return sum(a)    
}

//調用函數
func(5, closure)

//上面的調用等同于,直接將閉包代碼塊作為參數傳入
func(5, {
(a: Int) -> Int in 
return a + 5
})

//將閉包寫在括號外面
func (5){
(a: Int) -> Int in 
return a + 5
}

閉包的循環引用

循環引用的場景
  • 當 self 中強引用了閉包,而閉包中又使用了 self 時,會發生循環引用
  • 循環引用的三種解決方法
  1. 使用 oc 的 weakself 的寫法
    weak 的對象在運行時,有可能被設為 nil, 所以只能用 var, 且是可選的
    weak var weakself = self
    downloadBlock = {
    (money: String) in
    print(money)
    weakself!.textLabel!.text = "我下載了了(money)rmvb,快來和我做朋友吧"
    print("======(self)")
    }

2.使用 swfit 的 weakself 的寫法
[weak self] 表示閉包中的 self 是弱引用,在運行時可能被設為 nil,所以閉包中的 self 也是可選的

    downloadBlock = {
        [weak self] (money:  String) in
        print(money)
        self!.textLabel!.text = "我下載了了\(money)rmvb,快來和我做朋友吧"
        print("======\(self)")

3.使用 swift 中的 unknown
[unowned self] 和弱引用不同的是,unowned 引用是永遠有值的。因此,unowned 總是被定義為不可選;
如果 self 釋放,會產生野指針
使用的情況是 self 永遠不需要釋放

    downloadBlock = {
        [weak self] (money:  String) in
        print(money)
        self!.textLabel!.text = "我下載了了\(money)rmvb,快來和我做朋友吧"
        print("======\(self)")
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,786評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,656評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,697評論 0 379
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,098評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,855評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,254評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,322評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,473評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,014評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,833評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,016評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,568評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,273評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,680評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,946評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,730評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,006評論 2 374

推薦閱讀更多精彩內容