日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Swift 文档读后随写

發(fā)布時間:2023/12/20 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Swift 文档读后随写 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一. 常量&變量

簡單體驗

// 定義變量 var i = 10 print(i) i = 15 print(i)let j = 20 // 常量一經(jīng)定義不能自改數(shù)值 // j = 25 print(j) 復制代碼
  • 階段性小結(jié)
    • var 定義變量,設(shè)置之后可以修改
    • let 定義常量,設(shè)置之后不可以修改
    • 語句末尾不用使用 ;
    • 在 Swift 中使用 print() 替代 OC 中的 NSLog
    • print 的性能更好,后面會演示

定義 OC 對象

// 實例化視圖 let v = UIView(frame: CGRectMake(0, 0, 100, 100)) // 設(shè)置背景顏色 v.backgroundColor = UIColor.redColor()// 添加到根視圖 view.addSubview(v) 復制代碼
  • 階段性小結(jié)
    • 在 Swift 中要實例化一個對象可以使用 類名() 的格式,與 OC 中的 alloc/init 等價
    • OC 中的 initWithXXX 在 Swift 中通常可以使用 類名(XXX: ) 找到對應(yīng)的函數(shù)
    • OC 中的 [UIColor redColor] 類方法,在 Swift 中通常可以使用 類名.XXX 找到對應(yīng)的函數(shù)
    • 使用 let 修飾 v 并且賦值,表示 該常量的內(nèi)存地址不允許修改,但是可以修改其內(nèi)部的屬性
    • 當前對象的屬性,不需要使用 self.

常量&變量的使用原則:盡量先用 let,只有需要變的時候,再用 var,能夠更加安全

變量類型

let x = 10 let y = 10.5 let z: Double = 20print(Double(x) + y) print(x + Int(y)) print(y + z) 復制代碼
  • 階段性小結(jié)
    • 初次接觸 Swift 中會因為簡單的 var let 誤以為 Swift 中的類型非常松散
    • 其實所有變量的準確類型都是在賦值的同時自動推導的
    • Swift 是對類型要求非常嚴格的一門語言,一個值永遠不會被自動轉(zhuǎn)換成其他類型
    • 如果要轉(zhuǎn)換,必須顯示轉(zhuǎn)換,Swift 中
      • 小數(shù)默認是 Double 類型
      • 整數(shù)默認是 Int 類型
    • 如果要顯式的指定變量的類型,可以在定義是使用 var 變量名: 類型 = 值

二. 邏輯分支

簡單體驗

var i = 10if i > 0 {print("OK") } 復制代碼
  • 階段性小結(jié)
    • Swift 中沒有 C 語言中的非零即真概念
    • 在邏輯判斷時必須顯示地指明具體的判斷條件
    • if 語句條件的 () 可以省略
    • 但是 {} 不能省略

三目

var a = 10 var b = 50var result = a > b ? a : b print(result) 復制代碼
  • 階段性小結(jié)
    • Swift 中的 三目 運算保持了和 OC 一致的風格

可選項

演練 1

let url = NSURL(string: "http://www.520it.com/")if url != nil {NSURLSession.sharedSession().dataTaskWithURL(url!, completionHandler: { (data, _, _) -> Void inprint(NSString(data: data!, encoding: NSUTF8StringEncoding))}).resume() } 復制代碼
  • 階段性小結(jié)
    • 在 Swift 中,不是所有的對象實例化方法都會返回值,在實際開發(fā)中需要注意實例化函數(shù)的返回類型,例如:
convenience init?(string URLString: String) 復制代碼* 如果有 `?` 表示改方法有可能無法實例化到正確的對象 * 這種函數(shù)返回的對象,被稱為 `可選項`,即有可能有值,也有可能沒有值 * 實際開發(fā)時,需要針對這種對象加以判斷,并且在分支內(nèi)部使用 `!`,指明改對象確實是存在的 * 相比在 `OC` 的開發(fā),尤其在日常練習時,會給定一個能夠運行的值,而在實際運行時,一旦條件不滿足,會直接閃退,這樣用戶體驗會非常不好 復制代碼

Swift 的設(shè)計者考慮到因為對類型的強制要求,會讓代碼很難看,因此提供了一個變通的解決方案

演練 2

if let url = NSURL(string: "http://520it.com") {NSURLSession.sharedSession().dataTaskWithURL(url, completionHandler: { (data, _, _) -> Void inprint(NSString(data: data!, encoding: NSUTF8StringEncoding))}).resume() } 復制代碼
  • 階段性小結(jié)

    • 使用 if let 常量 = 可選構(gòu)造函數(shù) 的方式能夠確保分支內(nèi)部常量一定是有值的
    • 并且在分支內(nèi)部不再需要使用 !
    • 這是 Swift 代碼中的一個非常重要的使用技巧
  • 提示

    • 盡管 Swift 提供了類型校驗的手段,但是要寫出 優(yōu)雅 的 Swift 代碼,還是需要多加練習的,否則一不小心就會出現(xiàn)分支嵌套層次很深的代碼
    • 有關(guān) ? 和 ! 的選擇,可以借助 Xcode 的輔助工具,但是強烈建議每次遇到提示時,要多加思考,反復揣摩

演練3

var name: String? print(name?.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))name = "lnj" print(name?.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))let l = 10 print(l + (name?.lengthOfBytesUsingEncoding(NSUTF8StringEncoding) ?? 0)) 復制代碼
  • 階段性小結(jié)
    • ?? 是一個非常有用的操作符,能夠快速對 nil 進行判斷
    • 如果對象是 nil,則使用 ?? 后面的值代替前面的 nil 值參與計算
    • 在使用 ?? 時,整個部分需要使用 () 包裝
    • 這一技巧在 UITableView 的數(shù)據(jù)源方法中尤為重要

三. 循環(huán)

OC風格的 for

// 傳統(tǒng)寫法 for var i = 0; i < 10; i++ {print(i) } 復制代碼

Swift風格的 for

// 遍歷 0 ~ <10 for i in 0..<10 {print(i) }print("---")// 遍歷 0 ~ 10 for i in 0...10 {print(i) } 復制代碼
  • 階段性小結(jié)
    • Swift 中使用 in 關(guān)鍵字標示循環(huán)的范圍
    • 0..<10 表示從0到9
    • 0...10 表示從0到10
    • 注意之間不能出現(xiàn)空格

特殊寫法

for _ in 0...10 {print("hello") } 復制代碼
  • 階段性小結(jié)
    • 如果不關(guān)心循環(huán)本身的索引,可以使用 _ 忽略
    • 這一技巧在之前的分支演練中出現(xiàn)過

四. 字符串

在 Swift 中絕大多數(shù)的情況下,推薦使用 String 類型

使用 String 的原因

  • String 是一個結(jié)構(gòu)體,性能更高
    • String 目前具有了絕大多數(shù) NSString 的功能
    • String 支持直接遍歷
  • NSString 是一個 OC 對象,性能略差
  • Swift 提供了 String 和 NSString 之間的無縫轉(zhuǎn)換

遍歷字符串

let str = "我要飛的更High"for s in str {print(s) } 復制代碼

字符串拼接

let str1 = "zhangsan" let str2 = "lisi" let i = 10print(str1 + str2) print("\(str1) \(str2) \(i)") 復制代碼
  • 階段性小結(jié)
    • 直接在 "" 中使用 \(變量名) 的方式可以快速拼接字符串
    • 小伙伴們再也不要考慮 stringWithFormat 了

格式化字符串

for _ in 0...10 {let str = String(format: "zhangsan - %04d", arguments: [arc4random_uniform(100)])print(str) } 復制代碼
  • 階段性小結(jié)
    • 在實際開發(fā)中,如果需要指定字符串格式,可以使用 String(format:...) 的方式
    • 注意:后面的參數(shù)需要放在一個數(shù)組中

String & Range 的結(jié)合

以下是超級費勁的代碼

let str: String = "我要飛的更High"var subStr = str.substringWithRange(Range<String.Index>(start: str.startIndex, end: str.endIndex)) print(subStr) 復制代碼

建議寫法

let str1: NSString = "我要飛的更High" print(str1.substringWithRange(NSMakeRange(0, 3))) 復制代碼

五. 數(shù)組

簡單體驗

let arr = ["zhangsan", "lisi"] print(arr)// 遍歷每一個元素 for a in arr {print(a) }// 像 OC 一樣打印 print(arr as NSArray)復制代碼

數(shù)組中保存的對象類型

// 數(shù)組中保存的都是字符串 let arr = ["zhangsan", "lisi"]// 數(shù)組中保存的是 NSObject let arr1 = ["zhangsan", 1] 復制代碼
  • 階段性小結(jié)
    • 數(shù)組使用 [] 定義,這一點與 OC 相同
    • 如果初始化時,所有內(nèi)容類型一致,擇數(shù)組中保存的是該類型的內(nèi)容
    • 如果初始化時,所有內(nèi)容類型不一致,擇數(shù)組中保存的是 NSObject

常見數(shù)組操作

// 定義只能保存字符串類型數(shù)組 var array: [String]// 初始化數(shù)組 array = ["zhangsan"]// 添加元素 array.append("lisi")print(array)// 刪除元素 array.removeAtIndex(1) print(array)// 刪除所有元素 array.removeAll(keepCapacity: true) print(array.capacity)// 注意數(shù)組容量的變化 for i in 0..<10 {array.append("\(i)")print("\(array) --- \(array.capacity)") }// 實例化新的數(shù)組 var array2 = [String]() array2.append("1") array2.append("2")// 拼接數(shù)組 array += array2print(array) 復制代碼
  • 階段性小結(jié)
    • 如果定義數(shù)組時指定了保存對象的類型,擇不能向數(shù)組中添加其他類型的內(nèi)容
    • 可以使用 [String]()
    • let 定義的數(shù)組是不可變的
    • var 定義的數(shù)組是可變的

六.字典

/// 定義并實例化字典 var dict = [String: AnyObject]()dict["name"] = "zhangsan" dict["age"] = 18print(dict)// 設(shè)置相同 key,之前的數(shù)值會被覆蓋 dict["name"] = "lisi" print(dict)// 刪除某一個 key dict.removeValueForKey("age") print(dict)dict["title"] = "manager" print(dict)// 遍歷字典(k, v可以隨便寫) for (k, v) in dict {print("\(k) -- \(v)") }// 合并字典 var dict2 = ["name": "wangwu", "age": 80, "title": "boss"] for (k, v) in dict2 {dict.updateValue(v, forKey: k) } print(dict) 復制代碼

七. 函數(shù)

簡單演練

func sum(a: Int, b: Int) -> Int {return a + b } 復制代碼
  • 階段性小結(jié)
    • 函數(shù)定義格式:func 函數(shù)名(參數(shù): 參數(shù)類型...) -> 返回值 { // 代碼實現(xiàn) }
    • 如果沒有返回值, -> 返回值 可以省略
    • -> 是一個很有意思的符號
    • 默認情況下,在調(diào)用函數(shù)時,第一個參數(shù)名是省略的

參數(shù)名的特殊處理

強制要求參數(shù)名

func sum1(x a: Int, y b: Int) -> Int {return a + b } 復制代碼

省略參數(shù)名

func sum2(a: Int, _ b: Int) -> Int {return a + b } 復制代碼

八. 閉包

  • 閉包定義
  • 閉包簡化 - 尾隨閉包
  • 閉包參數(shù)
  • 閉包返回值
  • 閉包的循環(huán)引用
weak var weakSelf = self demo("zhangsan") { (_) -> Int inprint(weakSelf?.view.backgroundColor)return 20 } 復制代碼

九. 懶加載

lazy var demoView: UIView = {let v = UIView(frame: CGRectMake(10, 10, 100, 100))v.backgroundColor = UIColor.redColor()return v }() 復制代碼
  • 格式:
lazy var 變量: 類型 = { 創(chuàng)建變量代碼 }() 復制代碼
  • 懶加載的寫法本質(zhì)上是定義并執(zhí)行一個閉包

十. getter & setter

自定義 Person 類

class Person: NSObject {var name: String?var age: Int? } 復制代碼

getter & setter

var _name: String?var name: String? {get {return _name}set {_name = newValue} } 復制代碼
  • 在 Swift 中以上形式的 getter & setter 很少用

didSet

  • 在 OC 中,我們通常希望在給某一個變量賦值之后,去做一些額外的操作
  • 最經(jīng)典的應(yīng)用就是在自定義 Cell 的時候,通過模型的設(shè)置方法完成 Cell 的填充
var length: Int? {didSet {timeStr = String(format: "%02d:%02d:%02d", arguments: [length! / 3600, (length! % 3600) / 60, length! % 60])} } var timeStr: String? 復制代碼

計算型屬性

var title: String {get {return "Mr " + (name ?? "")} } 復制代碼
  • 只實現(xiàn) getter 方法的屬性被稱為計算型屬性,等同于 OC 中的 ReadOnly 屬性
  • 計算型屬性本身不占用內(nèi)存空間
  • 不可以給計算型屬性設(shè)置數(shù)值
  • 計算型屬性可以使用以下代碼簡寫
var title: String {return "Mr " + (name ?? "") } 復制代碼

構(gòu)造函數(shù)

init(dict: [NSObject: AnyObject]) {name = dict["name"] as? Stringage = dict["age"] as? Int } 復制代碼

析構(gòu)函數(shù)

deinit {print("88") } 復制代碼

十一. ATS 應(yīng)用傳輸安全

App Transport Security (ATS) lets an app add a declaration to its Info.plist file that specifies the domains with which it needs secure communication. ATS prevents accidental disclosure, provides secure default behavior, and is easy to adopt. You should adopt ATS as soon as possible, regardless of whether you’re creating a new app or updating an existing one.

If you’re developing a new app, you should use HTTPS exclusively. If you have an existing app, you should use HTTPS as much as you can right now, and create a plan for migrating the rest of your app as soon as possible.

強制訪問

<key>NSAppTransportSecurity</key> <dict><!--Include to allow all connections (DANGER)--><key>NSAllowsArbitraryLoads</key><true/> </dict> 復制代碼

設(shè)置白名單

<key>NSAppTransportSecurity</key> <dict><key>NSExceptionDomains</key><dict><key>localhost</key><dict><key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key><true/></dict></dict> </dict> 復制代碼

總結(jié)

以上是生活随笔為你收集整理的Swift 文档读后随写的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。