在學(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ǔ)充