Swift基本語法學習筆記

Swift與OC的不同點

  • 導入框架的方式
    • OC使用#import <UIKit/UIKit.h>
    • Swift使用import UIKit
  • 定義標識符的方式
    • Swift中定義標識符,必須指定該標識符是一個常量還是一個變量
  • 語句結束后的標志
    • Swift可以不用分號";"分割(只限于一行有一條語句時)
    • OC需要分號進行分割
  • 打印語句
    • 直接使用print()語句進行打印
    • OC中使用NSLog()語句進行打印

常量和變量的使用注意

  • 優先使用常量
  • 常量的本質:保存的時常量的內存地址,不可以修改,但可以通過內存地址拿到對象內部屬性進行修改

Swift中的類型推導

在定義一個標識符,如果有直接賦值,那么會根據賦值的類型推導出前面標識符的類型,所以后面的類型可以省略

Swift中沒有隱式轉換,所以只有相同類型之間才可以進行運算

顯式類型轉換:Int(),Double()等

邏輯分支

if條件判斷可以不要括號,沒有非0即真的概念

  • OC中BOOL的值為YES/NO
  • Swift中的布爾Bool類型的值為true/false

guard的使用,適合多層if嵌套,使用guard代替,該語法是自Swift 2.0以后推出的.作用和if相同,但是可讀性比if好.

switch的用法:

  • switch可以不跟()
  • case語句結束后,不跟break,系統會默認添加
  • 如果希望一個case中出現case穿透,可以在case語句結束后跟上fallthrough
  • case后面可以跟多個條件,多個條件以","分割
  • switch可以判斷浮點型
  • switch可以判斷字符串
  • switch可以判斷區間

swift中的區間表示:

  • a..<b 相當于數學上 [a, b)
  • a...b 相當于數學上 [a, b]
  • swift中沒有全開區間的概念,即沒有(a, b)的寫法

swift中的for循環:

  • for后面的括號可以省略
  • swift3中已經移除了普通的for循環寫法
  • forin寫法:區間遍歷
  • forin寫法,如果不需要用到下標值,可以用下劃線"_"省略

swift中的while循環

  • 在OC中,使用do while循環
  • 在swift中,使用repeat while循環

字符串

swift中的字符串為String類型,是個結構體.而OC中的NSString是對象,所以swift中的字符串類型比OC的效率高.

  • 定義字符串,可以不用指定String類型
  • 可以直接遍歷字符串中的字符,使用for c in str.characters{}
  • 字符串的拼接
    • 直接使用str1+str2
    • 拼接其他標識符的字符串:使用(str)
    • 字符串的格式化:String(format:"%02d:%02d", arguments: [min, second])
  • 字符串的截取:可以先轉換為OC的NSString類型,再進行截取
    • (urlString as NSString).substring(to: 3)
    • (urlString as NSString).substring(with: NSRange(location: 4, length: 5))
    • (urlString as NSString).substring(from: 10)

數組

  • 數組的定義:
    • 可變數組(使用let聲明):let array = ["a", "b"]
    • 不可變數組(使用var聲明):
      • var arrayM = Array()
      • var arrayM = [String]()
  • 對可變數組的操作:
    • 添加元素:arrayM.append("c")
    • 刪除元素:arrayM.remove(at: 0)
    • 修改元素:arrayM[0] = "m"
    • 獲取元素:arrayM[0]
  • 遍歷數組:
    • for i in 0..<arrayM.count {}
    • for name in arrayM {}
    • for i in arrayM[0..<2] {}
  • 數組的合并:
    • swift中,如果兩個數組類型是完全一致的,才可以進行相加合并.

字典

  • 字典的定義:
    • 不可變字典(let)
      • 注意:在swift中無論是數組還是字典,都使用[],但是如果[]中存放的是元素,編譯器會認為是一個數組.如果[]中存放的是鍵值對,編譯器會認為是一個字典.
      • let dict = ["key" : "value"]
    • 可變字典(var)
      • var dictM = Dictionary<String, AnyObject>()
      • var dictM = [String : AnyObject]()
      • 注意:一般在指定數據類型時,使用AnyObject,在聲明變量類型時使用NSObject.
  • 對可變字典的操作:
    • 添加元素:dictM["newKey"] = "newValue"
    • 修改元素:dictM["key"] = "newValue",如果存在key,則覆蓋該key之前的value,如果不存在key,則直接添加.
    • 刪除元素:dictM.removeValue(forKey: "key")
    • 獲取元素:dictM["key"]
  • 遍歷字典:
    • 遍歷所有的key:for key in dictM.keys {}
    • 遍歷所有的value:for value in dictM.values {}
    • 遍歷所有的key/value: for (key, value) in dictM {}
  • 合并字典:
    • 注意:即使兩個字典的類型一致,也不能進行相加合并
    • 如果必須進行合并,可以遍歷一個字典,將其逐個添加到另外一個字典中.

元組

元組一般用于函數的返回值,其與數組和字典功能類似,但是寫法更為直觀,所以swift中新增了元祖的類型.

  • 元組的基本寫法:let userInfo = ("name", 18, 1.8)
    • userInfo.0
  • 給每一個元素起別名:let userInfo = (name: "name", age: 18, height: 1.8)
    • userInfo.name
  • 別名就是元組變量的名稱
    • let (name, age, height) = ("name", 18, 1.8)
    • 直接使用name,age,height即可獲取元組中元素的值

可選類型

可選類型的作用:當聲明一個變量為String類型,而想要給它賦值為nil,需要使用可選類型.

  • 定義方式:
    • 方式一:基本定義方式,不常用,var name: Optional = nil
    • 方式二:語法糖,常用,var name: String? = nil
  • 給可選類型賦值:name = "abc"
    • 在使用可選類型時,拿到optional(具體的值)
  • 強制解包:
    • 通過在變量后使用"!"來進行強制解包
    • 注意:強制解包是非常危險的過程,在強制解包時,如果里面沒有值,程序會發生崩潰.
    • 嚴謹的解包方式:if name != nil {}
  • 可選綁定:
    • 如果name不等于nil,則解包name,并且將解包后的值賦值給新值
    • 方式一(不常用):if let tempName = name {}
    • 方式二(常用):if let name = name {}
    • 以上操作其實可以分為兩步:
      • 首先判斷name是否有值
      • 如果有值,則進行強制解包(系統會默認處理),并且將解包后的值賦給前面的常量,并執行大括號里面的代碼
      • 如果沒有值,則不進行強制解包,同時也不執行括號里面的代碼

可選類型的應用場景

在使用一個字符串創建URL類型的常量時,需要使用可選類型

因為如果字符串中包含中文時,創建的URL對象可能為空

在使用的時候,需要對可選類型進行判斷,此時可以使用可選綁定,在大括號內創建NSURLRequest對象

函數

在OC中叫做方法,在swift中叫做函數

  • 沒有參數,沒有返回值
    • func about() -> Void {}
    • func about() {}
  • 沒有參數,有返回值
    • func readMessage() -> String {}
  • 有參數,沒有返回值
    • func callPhone(phoneNum : String) -> Void {}
    • func callPhone(phoneNum : String) {}
  • 有參數,有返回值
    • func sum(num1: Int, num2: Int) -> Int {}

函數的注意點

  • 注意一:內部參數和外部參數
    • 內部參數:在函數內部可以看到的參數就是內部參數,默認情況下所有的參數都是內部參數
    • 外部參數:在函數外部可以看到的參數名稱就是外部參數,在swift3之前默認從第二個參數開始既是內部參數又是外部參數,但是從swift3開始,默認第一個內部參數也是外部參數.
  • 注意二:swift中的默認參數
    • func makeCoffe(coffeName: String = "雀巢") -> String {}
    • 在調用函數是,如果沒有傳遞某個參數的值,swift會根據函數的聲明,自動添加默認參數的值.
  • 注意三:可變參數
    • func sum(num: Int...) -> Int {}
  • 注意四:指針類型
    • swift函數參數,默認是值傳遞,在函數中直接交換兩個參數的值,調用函數后,參數的值并不會發生改變.
    • func swapNum(m: inout Int, n: intout Int) {}
    • 調用時:swapNum(m: &m, n: &n)
  • 注意五:函數的嵌套使用(用的不多,了解即可)
    • 在函數內部,可以聲明新的函數,如果不調用,則不會執行函數內的代碼.
    • 只有在調用了函數,才會執行,哪里調用就在哪里執行.

Swift中類的注意事項

  1. 類的定義
  • 可以不繼承任何類:class Person {}
  • 可以繼承NSObject:class Person : NSObject {}
  • 不繼承父類,可以使自定義的類更加輕量級.如果需要使用到NSObject中的屬性或方法,則需要繼承,比如使用KVC對屬性進行賦值
  • 注意:任何一個類,都要保證它里面的屬性,在類初始化的時候要有一個默認值.
  1. 創建類對應的對象
  • let p = Person()
  • let p: Person = Person()
  1. 給類的屬性賦值
  • 可以通過點語法直接賦值
  • 也可以通過KVC,調用類對象的setValuesForKeys()方法
  1. 可以重寫setValue...forUndefinedKey方法,那么字典中沒有的字段可以在類中沒有對應的屬性,程序也不會報錯.
  2. 如果要寫的某一個方法是對父類方法的重寫,那么必須在該方法前加上override關鍵字

定義Swift類中的屬性

在swift中,聲明的類屬性都需要進行初始化,類屬性分為三類:

  • 存儲屬性:
    • var age: Int = 0
    • var mathScore: Double = 0.0
    • var chineseScore: Double = 0.0
  • 計算屬性:
    • 通過別的方式計算到結果的屬性,稱之為計算屬性
    • var averageScore: Double { return (mathScore + chineseScore) * 0.5 }
  • 類屬性:
    • 類屬性是和整個類相關的屬性,而且是通過類名進行訪問
    • 在生成單例的時候,會用到類屬性
    • static var courseCount: Int = 0

給類屬性賦值:Student.courseCount = 2

創建對象:let stu = Student()

給對象的屬性賦值:stu.age = 10

直接使用計算屬性:let averageScore = stu.averageStudent

在swift開發中,如果使用當前對象的某一個屬性,或者調用當前對象的某一個方法時,可以直接使用,不需要加self.但是在產生歧義的情況下,還是需要加上self的.

Swift中類的構造方法

swift中類的構造函數和OC中的初始化方法功能相同,只是寫法不同.

在構造函數中,如果沒有明確super.init(),那么系統會幫助調用super.init()

  • 自定義構造函數:
    • 參數非字典類型:init(name: String, age: Int) {}
    • 參數為字典類型:
      • 可以直接遍歷字典,在遍歷字典的時候,需要判斷可選類型,然后轉換可選類型,再使用可選綁定,對屬性進行賦值
      • 也可以直接使用KVC,但是在調用setValueForKeys()前,需要調用父類的初始化函數super.init(),雖然系統會默認調用該函數,但是在自定義構造函數尾部才去調用,所以需要首先調用super.init().
      • 在使用KVC的時候,也需要重寫setValue(forUndefinedKey)方法,以便處理類中沒有定義key的屬性.

屬性監聽器

class Person: NSObject {// 屬性監聽器var name : String? {// 屬性即將改變時進行監聽willSet {print(name)print(newValue)}// 屬性已經改變時進行監聽didSet {print(name)print(oldValue)}}
}

回顧OC中的block

使用block模擬網絡請求中的回調

  • 自定義一個網絡請求的工具類HttpTool,提供loadData方法
- (void)loadData:(void (^)(NSString *))callBack
{dispatch_async(dispatch_get_global_queue(0, 0), ^{NSLog(@"發送網絡請求:%@", [NSThread currentThread]);dispatch_sync(dispatch_get_main_queue(), ^{NSLog(@"拿到數據,并且進行回調:%@", [NSThread currentThread]);callBack(@"json數據");});});
}
  • 在ViewController中通過點擊屏幕,在ViewController中拿到block返回的數據
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{/*__weak修飾的弱引用,如果指向的對象銷毀,那么指針會立馬指向nil(0x0)__unsafe_unretained修飾的弱引用,如果指向的對象銷毀,那么指針依然指向之前的內存地址,很容易產生'野指針'/'僵尸對象'*/__weak ViewController *weakSelf = self;[self.tools loadData:^(NSString *jsonData) {// NSLog(@"在ViewController拿到數據:%@", jsonData);weakSelf.view.backgroundColor = [UIColor redColor];}];
}

閉包

閉包的寫法:(參數列表) -> (返回值類型)

weakself?.view

  • 如果前面的可選類型,沒有值,后面所有的代碼都不會執行
  • 如果前面的可選類型,有值,系統會自動將weakself進行解包,并且使用weakself

閉包解決循環引用的三種方式:

  • 方式一(寫法比較復雜):使用weak var weakSelf = self
    • 注意:必須使用var來聲明,因為self可能會發生變化,如果使用let聲明,編譯器會報錯.
  • 方式二(比較危險,當self指向nil時,可能會發生崩潰):tools.loadData {[unowned self] (jsonData) -> () in ... }
  • 方式三(常用寫法):tools.loadData {[weak self] (jsonData) -> () in ... }

尾隨閉包:如果閉包作為方法的最后一個參數,那么閉包可以將()省略掉

  • 普通寫法:tools.loadData ({[weak self] (jsonData) -> () in ... })
  • 尾隨閉包的寫法一:tools.loadData() {[weak self] (jsonData) -> () in ... }
    - 但是閉包中可以直接使用self,而不需要進行解包
  • 尾隨閉包的寫法二(系統默認寫法):tools.loadData {[weak self] (jsonData) -> () in ... }

注意:swift中的deinit()方法相當于OC中的dealloc方法,當對象銷毀時,會調用該函數.

  • OC中使用__weak修飾self,當對象銷毀時,self將指向nil(0x0)

  • OC中使用__unsafe__unretain修飾self,當對象銷毀時,self仍指向原內存地址,會產生"野指針"錯誤或"僵尸對象",這個寫法相當于swift中的unowned.

懶加載

  • 懶加載的介紹

    • swift中也有懶加載的方式.
    • 蘋果的設計思想:希望所有的對象在使用時才真正加載到內存中
    • 和OC不同的是,swift有專門的關鍵字來實現懶加載
    • lazy關鍵字可以用于定義某一個屬性懶加載
  • 懶加載的使用

    • 格式:lazy var 變量: 類型 = {創建變量的代碼}()
// 懶加載的本質是,在第一次使用的時候,執行閉包
// 將閉包的返回值賦值給屬性
// lazy的作用是只會賦值一次
lazy var array: [String] = {() -> [String] inreturn ["abc", "def", "ghi"]
}()

也可以寫成下面這種方式

lazy var array: [String] = {return ["abc", "def", "ghi"]
}()

轉載于:https://www.cnblogs.com/coderwjq/p/6004981.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/270634.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/270634.shtml
英文地址,請注明出處:http://en.pswp.cn/news/270634.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

網絡知識:IP地址的概念以及IPV4和IPV6的區別

小伙伴們看到上面的機房了嗎&#xff1f;成千上萬臺服務器他們都少不了一個小小的IP地址&#xff0c;每臺服務器都配置了一個或多個IP。今天電腦學習微信公眾號小編就帶大家詳細了解下IP地址都是什么&#xff1f; IP地址&#xff08;Internet Protocol Address&#xff09;是指…

新安裝Win10操作系統有必要設置的幾個技巧

目錄 1、控制面版、回收站、網絡等圖標放到桌面 2、找回Win10系統刪除提示框 3、關閉電腦休眠并刪除hiberfil.sys 睡眠緩存文件 3、關閉Microsoft Store自動更新 4、卸載Win10自帶的軟件 5、關閉自動播放功能 6、刪除離線地圖文件并禁止更新離線地圖 新安裝Win10操作系統有必要…

apk私鑰_獲取APK證書MD5、SHA1、SHA256等秘鑰

一1.先把apk解壓2.在META_INF目錄下找到xxx.RSA文件3.確保安裝了jdk并且正確配置了環境變量4.cmd中執行keytool -printcert -file xxxx.RSA目錄image.png二1.確保安裝了jdk并且正確配置了環境變量。2.cmd中執行keytool -printcert -jarfile xxx.apk運行效果如下&#xff1a;ima…

查看某個端口的進程 lsof -i:端口號

查看某個端口的進程 lsof -i:端口號

10.27 noip模擬試題

1.鋪瓷磚&#xff08;tile.cpp/c/pas&#xff09;【問題描述】有一面很長很長的墻。 你需要在這面墻上貼上兩行瓷磚。 你的手頭有兩種不同尺寸的瓷磚&#xff0c;你希望用這兩種瓷磚各貼一行。瓷磚的長可以用分數表示&#xff0c;貼在第一行的每塊瓷磚長度為 AB &#xff0c;貼…

Windows操作系統裝機必備軟件,值得收藏

??作者主頁&#xff1a;IT技術分享社區 ??作者簡介&#xff1a;大家好,我是IT技術分享社區的博主&#xff0c;從事C#、Java開發九年&#xff0c;對數據庫、C#、Java、前端、運維、電腦技巧等經驗豐富。 ??個人榮譽&#xff1a; 數據庫領域優質創作者&#x1f3c6;&#x…

最詳細的Mac下安裝nacos教程來了

什么是 Nacos 概覽 歡迎來到 Nacos 的世界&#xff01; Nacos 致力于幫助您發現、配置和管理微服務。Nacos 提供了一組簡單易用的特性集&#xff0c;幫助您快速實現動態服務發現、服務配置、服務元數據及流量管理。 Nacos 幫助您更敏捷和容易地構建、交付和管理微服務平臺。…

android php mysql json 查詢_android php mysql json

$con mysql_connect("localhost", "db163810_f", "1e6969e2");if (!$con){die(不能建立連接: . mysql_error());}$db_selected mysql_select_db("db163810",$con);mysql_query("SET NAMES utf8");if (!$db_selected){die…

純css改變下拉列表select框的默認樣式

下列CSS就可以解決&#xff0c;原理是將瀏覽器默認的下拉框樣式清除&#xff0c;然后應用上自己的&#xff0c;再附一張向右對齊小箭頭的圖片即可。 select {/*Chrome和Firefox里面的邊框是不一樣的&#xff0c;所以復寫了一下*/border: solid 1px #000;/*很關鍵&#xff1a;將…

電腦軟件:推薦5款實用的效率軟件

目錄 1、圖片管理神器-Image Tuner 2、系統維護神器-Dism 3、桌面效率神器-蜂窩桌面整理 4、鍵鼠模擬軟件-按鍵精靈 5、書簽管理神器-Toby for Chrome 今天小編大家推薦5款實用的效率神器&#xff0c;希望對大家能有所幫助&#xff01; 1、圖片管理神器-Image Tuner 1000張圖片…

SpringCloud版本說明

SpringCloud包含了眾多子項目&#xff0c;每一個子項目發布時間不一定一致&#xff0c;所以采用了倫敦地鐵站為版本說明&#xff0c;而不是數字。并且從A開始是第一個發布版&#xff0c;B是第二個&#xff0c;以此類推。 SpringCloud版本SpringBoot版本Greenwich(格林威治)2.1…

JQuery中$.ajax()方法參數詳解

url: 要求為String類型的參數&#xff0c;&#xff08;默認為當前頁地址&#xff09;發送請求的地址。 type: 要求為String類型的參數&#xff0c;請求方式&#xff08;post或get&#xff09;默認為get。注意其他http請求方法&#xff0c;例如put和 delete也可以使用&#xff0…

數據庫:Redis數據庫優點介紹

1、速度快 不需要等待磁盤的IO&#xff0c;在內存之間進行的數據存儲和查詢&#xff0c;速度非常快。當然&#xff0c;緩存的數據總量不能太大&#xff0c;因為受到物理內存空間大小的限制。 2、支持多種數據庫類型 豐富的數據結構 除了string之外&#xff0c;還有list、hash、…

bat-bat-bat (重要的事情說三遍)

去年noip前prey親授&#xff0c;當時就覺得這是個好東西&#xff01;非常好&#xff01;然后我就沒學會。接著最近被安利小紅的bat&#xff01;&#xff01;&#xff01; 小紅bat&#xff01;&#xff01;&#xff01; get&#xff01;&#xff01;&#xff01;謝小紅&#xff…

mysql開方_MySQL數學函數的實際用法

此文章主要向大家描述的是MySQL數學函數的實際用法以及在實際操作中值得大家注意的問題&#xff0c;MySQL數學函數是MySQL函數中經常被用到的&#xff0c;所以對其有一定的了解還是有你有所幫助的。ABS (number2 ) //絕對值BIN (decimal_number ) //十進制轉二進制CEILING (num…

POJ 2323 貪心

題意&#xff1a; 思路&#xff1a; 貪 貪 貪 如果當前的c>之前的cs 那么之前的合適 一直貪下去就好了 //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define int long long int n,s,rec1,c[105…

mysql調度觸發器,MySQL觸發器:達到某個datetime時更新

I want to create a MySQL trigger that updates a table everytime one of the datetime rows in a different table reaches a datetime lower than now.How would I accomplish this? Is that even possible?To illustrate:table_1 table_2-------- ------------------- -…

實驗二簡化版C語言中文理解程序文法

<程序>&#xff1a;&#xff1a;begin<語句串>end <語句串>&#xff1a;&#xff1a;<語句>{;<語句>} <語句>&#xff1a;&#xff1a;<賦值語句> <賦值語句>&#xff1a;&#xff1a;ID<表達式> <表達式>&#x…

常用軟件:推薦七款裝機必備的軟件

目錄 1.桌面日歷 2.FileViewPro——萬能文件查看器 3.FSCapture 4.天若OCR 5.Gif Cam 6、Sticky Notes 7、PotPlayer 1.桌面日歷 工作之后事情越來越多&#xff0c;一款好用的桌面日歷可以讓幫你掌握全局&#xff01; 點擊每個窗格 可以直接添加待辦事項。 完成的事件可以劃橫…