Swift--關(guān)鍵字(private、fileprivate、guard let、if let、try異常處理、as、!?)

在學(xué)習(xí)swift的過(guò)程中,過(guò)于修飾屬性 方法的關(guān)鍵詞這肯定是必須要搞明白的.相比較oc而言,swift多了一些關(guān)鍵字.下面我們分別來(lái)看看他們各自的一些使用場(chǎng)景和作用

private

private:私有權(quán)限,只能在當(dāng)前的類中使用.具體是什么意思呢?我們先看下面的代碼就明白了了

class MineViewController: BaseViewController {
    private var age:NSInteger = 10

extension MineViewController:TestDelegate {
    
    func testname(_ name: String) -> String {
        print(self.age)
        return name
    }
}

class TestVC: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()

        let mineVC = MineViewController.init()
        print(mineVC.age)
        
        // Do any additional setup after loading the view.
        
    }
}

我們可以看到這段代碼,在MineViewController中有一個(gè)私有屬性age,在extension中我們也是可以訪問(wèn)的.但我們發(fā)現(xiàn)在這個(gè)文件中 我們還創(chuàng)建了一個(gè)TestVC,在這個(gè)類中訪問(wèn)age 局會(huì)報(bào)錯(cuò),提示我們這個(gè)屬性是私有的.
通過(guò)上面代碼 我們就能明白private的訪問(wèn)范圍只能是當(dāng)前類或者這個(gè)類的擴(kuò)展中.就相當(dāng)于只能我或者我兒子使用,其他人都不行.

fileprivate

fileprivate:相較于private,它的訪問(wèn)權(quán)限稍微大了點(diǎn).只能在這個(gè)文件中訪問(wèn).有的人可能不明白,必須上代碼了

class MineViewController: BaseViewController {
    fileprivate var namestr:String?="harry

extension MineViewController:TestDelegate {
    
    func testname(_ name: String) -> String {
        print(self.namestr)
        return name
    }
}

class TestVC: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()

        let mineVC = MineViewController.init()
        print(mineVC.namestr)
        
        // Do any additional setup after loading the view.
        
    }
}   

和private比較一下,發(fā)現(xiàn)TestVC里 是可以訪問(wèn)namestr的.這就是我們上面說(shuō)的 在文件中.繼續(xù)我們的比喻,這個(gè)就相當(dāng)于:只要進(jìn)了房子,在家的,都可以使用.有人會(huì)問(wèn),那我重新創(chuàng)建一個(gè)類 能不能訪問(wèn)呢?這肯定不行啊.這個(gè)時(shí)候 我們就需要了解internal

internal

internal:默認(rèn)的訪問(wèn)級(jí)別,這個(gè)就是在我們當(dāng)前的app代碼塊,自己寫的代碼里面都可以訪問(wèn).但像第三方的一些庫(kù)是沒(méi)辦法訪問(wèn)的.我們可以把它比喻成:就像一個(gè)村子里面的人 都可以使用.

public

public:可以在app的任何地方訪問(wèn),但是不能在第三方的一些庫(kù)中重寫和繼承. 這個(gè)就是:我現(xiàn)在又這個(gè)東西,你們所有的人都能用,但不能改造我的東西.

open

open:任何人都可以使用,就是 隨便造 隨便改.

if let/var

if和if let的比較

var nickname:String?
if self.nickname != nil {
            print(self.nickname)
        }
        
        if let newnickname = self.nickname {
            print(newnickname)
        }
 if var nickname = nickname {
            nickname = "100"
            print(nickname)
        }

nickname是一個(gè)可選型,我們看到在if判斷中,打印值.是會(huì)有警告的.這個(gè)時(shí)候我們沒(méi)有解包.
而在if let判斷中 不需要我們?cè)偃ソ獍?在括號(hào)內(nèi)保證有值. let var是可以改變值

guard let

guard let和if let正好相反,guard let判斷是否有值,如果沒(méi)有 則直接return返回

 guard let nickname = nickname else {
            return
        }
        nickname = "youzhi "

可以看到,guard let比if let少了一層,有值操作外面沒(méi)有{}了.
if let和guard let在我們項(xiàng)目中都會(huì)用到

discardableResult

discardableResult:是去掉警告的作用.當(dāng)一個(gè)函數(shù)它有返回值的時(shí)候,例如 func parseText(_ text: NSMutableAttributedString?, selectedRange: NSRangePointer?) -> Bool 返回一個(gè)bool值.
但我們直接調(diào)用parseText,并沒(méi)有去接受他的返回值的時(shí)候.在oc中不能調(diào)用,但是在swift中是可以調(diào)用的,這個(gè)時(shí)候是有警告的.我們可以用discardableResult消除警告

mutating

寫在func前面,以便讓func可以修改struct和protocol的extension中的成員的值。如果不加此關(guān)鍵字,成員值便被保護(hù)起來(lái),不得修改

struct TestClass{
    
    var nickname:String = "昵稱是"
  mutating  func savestr() -> Void{
      nickname = "改變昵稱"
        print(nickname)
    }
    
}

如果不加mutating的話,是沒(méi)法改變nickname的值的.必須加上mutating才能行.

try處理異常的三種方式

方式一: do try 需要開發(fā)者自己去捕獲異常

 do{
                let dict = try JSONSerialization.jsonObject(with: d, options: [])
                print(dict)
            }catch{
                // catch 中默認(rèn)提供error信息, 當(dāng)序列化不成功是, 返回error
                print(error)
            }

方式二:交給系統(tǒng)來(lái)處理

let dict = try? JSONSerialization.jsonObject(with: d, options: [])

當(dāng)方序列化成功時(shí),就給返回值,不成功的話就返回nil
方式三::try!方法

let anyObject = try!NSJSONSerialization.JSONObjectWithData(jsonData, options: .MutableContainers)

直接告訴系統(tǒng) 沒(méi)有異常,如果存在異常直接奔潰

as as! as?
as

as的作用1.可以將子類裝換成基類 2.可以轉(zhuǎn)換數(shù)值的類型

let mineVC = MineViewController()
        let baseVC = mineVC as BaseViewController
        
        let num = 56 as Int
        let height = 11 as CGFloat

minevc是base的子類,我們可以通過(guò)as 把minevc轉(zhuǎn)換成base父類.同樣的num可以通過(guò)as 轉(zhuǎn)換成int或者cgfloat.

as?

一看到? 就知道它是一個(gè)可選型.當(dāng)as 轉(zhuǎn)換失敗的時(shí)候 返回的是nil

  let mineVC = MineViewController()
        let baseVC = mineVC as? SearchViewController
        print(baseVC)

因?yàn)閙inevc是base的子類,現(xiàn)在我們寫了一個(gè)SearchViewController,肯定是轉(zhuǎn)換不過(guò)來(lái)的.這時(shí)候查看打印 發(fā)現(xiàn)打印出來(lái)的是nil

as!

看到!,我們就能知道,如果as轉(zhuǎn)換失敗,直接就奔潰了.所以使用as!時(shí)候,你要確定100%的能轉(zhuǎn)換成功才行.不然直接閃退是很影響用戶體驗(yàn)的

let mineVC = MineViewController()
        let baseVC = mineVC as! SearchViewController
        print(baseVC)
?

首先我們?cè)谏昝髯兞繒r(shí)候

var dynicModel:DynamicModel?

我們需要操作這個(gè)變量時(shí),應(yīng)該怎么做呢

//如果不適用if let和guard let進(jìn)行解包
 self.nameLabel.text = dynicModel?.name

?表示當(dāng)前dynicModel存在疑慮,不確定它是否存在有值,假如不存在的話就返回nil

!

和?不同,!表示我就要強(qiáng)制解包,dynicModel如果是不存在的,那就直接崩掉.
所以 使用!時(shí)候 要確定解包的對(duì)象他是一定存在的

剛開始學(xué)習(xí)寫項(xiàng)目,常用的就這些,后續(xù)就不斷的補(bǔ)充

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、數(shù)值類型 swift基本數(shù)據(jù)類型Int、UInt、Float、Double、Bool、String、Chara...
    史記_d5da閱讀 1,893評(píng)論 0 5
  • 一、簡(jiǎn)介 關(guān)鍵字 指swift已經(jīng)使用的字段,如let var等。特性 通過(guò)在@符號(hào)后跟一個(gè)特性名稱與參數(shù),來(lái)聲明...
    想聽丿伱說(shuō)衹愛我閱讀 405評(píng)論 0 1
  • Swift關(guān)鍵字匯總?cè)缦拢?一: 常見使用頻繁的關(guān)鍵字: 1,訪問(wèn)修飾符:在swift中,訪問(wèn)修飾符有五種,分別是...
    物非0人非閱讀 3,704評(píng)論 2 15
  • deinit: 當(dāng)一個(gè)類的實(shí)例即將被銷毀時(shí),會(huì)調(diào)用這個(gè)方法。 extension:允許給已有的類、結(jié)構(gòu)體、枚舉、協(xié)...
    Rockerliang閱讀 856評(píng)論 0 1
  • ? ! ? Swift是一個(gè)強(qiáng)類型語(yǔ)言,它希望在編譯器做更多的安全檢查,所以引入了類型判斷。而在類型判斷上如果...
    HuangJn閱讀 914評(píng)論 0 1

友情鏈接更多精彩內(nèi)容