命名空間
swift中引入了命名空間的概念踢京,只要在同一個(gè)命名空間下所有的資源都是共享的色建,而且默認(rèn)情況下項(xiàng)目名稱就是命名空間哺呜;如果使用swift開發(fā)中使用第三方框架最好使用cocospad
,這樣第三方的所有東西都會(huì)被另外一個(gè)工程所管理箕戳,不會(huì)因?yàn)槊臻g問題產(chǎn)生某残,變量等的重定義。
1陵吸、獲取命名空間名稱
//獲取命名空間
let namespace = NSBundle.mainBundle().infoDictionary!["CFBundleExecutable"] as! String`
//用字符串創(chuàng)建類
let aClass = NSClassFromString(namespace + "." + valueTypeString)
//用字符串創(chuàng)建控制器
let namespace = NSBundle.mainBundle().infoDictionary!["CFBundleExecutable"] as! String
// let cls = NSClassFromString(namespace + "." + "HomeTableViewController") as! UIViewController.Type
let clsName = NSClassFromString(namespace + "." + "HomeTableViewController")
let cls = clsName as! UIViewController.Type
let vc = cls.init()
print(vc)
2玻墅、修改命名空間名稱
可選類型
1、swift中的方法或者數(shù)據(jù)類型后面有一個(gè)?
就代表返回的是一個(gè)可選類型Optional壮虫。
2澳厢、可選值必須解包才可以參加計(jì)算,如果不解包可選值會(huì)被Optional包裹旨指,是不能參加計(jì)算的
3赏酥、應(yīng)該盡量使用guard let ... else
和if let
解包,避免一堆?
和!
的情況
4谆构、只有在迫不得已而且絕對(duì)確定強(qiáng)制解包不會(huì)導(dǎo)致崩潰的情況下,才使用強(qiáng)制解包框都,否則可能導(dǎo)致程序崩潰
1搬素、可選類型的定義?
var name:String?//可選類型定義
name = "Hello world!!!"
print(name) //打印輸出結(jié)果Optional("Hello world!!!")
print(name!)//強(qiáng)制解包輸出結(jié)果Hello world!!!
2、可選類型解包
2.1魏保、強(qiáng)制解包!
:強(qiáng)制解包就是在需要強(qiáng)制解包的變量后面添加一個(gè)!
var fullName:String?
print(url!)//強(qiáng)制解包熬尺,奔潰
fullName = "姓名"
print(url!)//強(qiáng)制解包成功
為避免因?yàn)閺?qiáng)制解包導(dǎo)致的奔潰,swift提供了可選值綁定
2.2谓罗、可選解包使用guard let ... else
和if let
解包
if let & guard let 的命名技巧:直接使用同名
//guard let ... else
var fullName:String?
var firstName:String?
var secondName:String?
fullName = "姓名"
firstName = "名字"
secondName = "姓氏"
guard let full_name = fullName,
first_name = firstName,
second_name = secondName else
{
return;//本次解包不成功可選值存在`nil`粱哼,退出本次解包,也可能使用到`continue`
}
//解包成功
print(full_name + "," + first_name + "," + second_name)
//if let
var fullName:String?
var firstName:String?
var secondName:String?
fullName = "姓名"
firstName = "名字"
secondName = "姓氏"
if let full_name = fullName,
first_name = firstName,
second_name = secondName
{
//解包成功
print(full_name + "," + first_name + "," + second_name)
}
2.3檩咱、guard case let / if case let
2.4揭措、for case let
2.5、switch case let
類型轉(zhuǎn)換
swift不存在隱式類型轉(zhuǎn)換
1)基礎(chǔ)類型轉(zhuǎn)換
目的類型(變量)
剛好不同與OC
2)可選類型刻蚯,對(duì)象绊含,結(jié)構(gòu)體類型轉(zhuǎn)換is
,as
炊汹,as?
躬充,as!
因?yàn)閟wift中的結(jié)構(gòu)體和class都可以通過()
來創(chuàng)建,所有基礎(chǔ)類型的轉(zhuǎn)換方法是不能做類型轉(zhuǎn)換的
3)swift中除去String
類型,其他多數(shù)情況下as
需要使用as?
和as!
充甚,起碼我很少見到
//is
是否可以做類型轉(zhuǎn)換以政,可以返回true,不可以返回false
//as
//as?
帶條件的類型轉(zhuǎn)換伴找,返回optional類型妙蔗,轉(zhuǎn)換成功返回轉(zhuǎn)換后的值,失敗返回nil
//as!
強(qiáng)制轉(zhuǎn)換疆瑰,返回指定類型眉反,轉(zhuǎn)換失敗運(yùn)行時(shí)報(bào)錯(cuò)
//as?和as!選擇
要進(jìn)行轉(zhuǎn)換的是as?使用as?,是as!使用
懶加載
1穆役、swift中的懶加載與OC不同寸五,懶加載的閉包只會(huì)執(zhí)行一次,然后分配獨(dú)立的存儲(chǔ)空間
耿币,即使將懶加載的變量直接設(shè)置為nil閉包也不會(huì)再執(zhí)行一次梳杏,所以不要在內(nèi)存警告的時(shí)候?qū)屑虞d的view設(shè)置為nil,從父控件移除
2淹接、懶加載的本質(zhì)是閉包
3十性、懶加載只在結(jié)構(gòu)體和class中有效,不要在playground
中直接使用
4塑悼、通常情況下只要在有初始化的變量前添加關(guān)鍵字lazy
即可懶加載變量var name = ""
懶加載稱為lazy var name = ""
5劲适、只能懶加載變量,常量不能懶加載
6厢蒜、懶加載的構(gòu)造方法沒有智能提示霞势,eg:UITableView
懶加載就沒有智能提示構(gòu)造方法,得生敲
//完整版的懶加載代碼
lazy var myView:UIView = { ()->UIView in
return UIView()
}()
//常用的懶加載代碼
lazy var myView:UIView = {
//邏輯判斷
return UIView()
}()
lazy var myView:UIView = UIView()
lazy var name = ""
@objc
1斑鸦、swift中使用@objc
修飾的類型可以通過OC的Runtime的消息機(jī)制進(jìn)行調(diào)用
2阳欲、在把按鈕定義槽方法private
后需要用@objc
修飾槽方法鲫构,否則會(huì)調(diào)用失敗伦忠,如果不用@objc
修飾會(huì)報(bào)錯(cuò)
3滤蝠、在使用optional
關(guān)鍵字定義協(xié)議方法的時(shí)候需要用@objc
修飾協(xié)議,因?yàn)閟wift中的協(xié)議方法默認(rèn)是必須實(shí)現(xiàn)的嘱巾,選擇實(shí)現(xiàn)是OC的特性
//按鈕槽方法
button.addTarget(self, action: #selector(test), for: .touchUpInside)
@objc private func test()
{
}
//定義協(xié)議
@objc protocol MyProtocol {
optional func test() -> Int
}
.self憨琳,.Type,.Protocol
1浓冒、.self
可以用在類型后面取得類型本身栽渴,也可以用在某個(gè)實(shí)例后面取得這個(gè)實(shí)例本身
2、.Type
可以用在類型后面表示的是某個(gè)類型的元類型
3稳懒、.Protocol
可以用在protocol類型后面表示的是某個(gè)protocol類型的元類型
//注冊(cè)cell
self.tableView.registerClass(
UITableViewCell.self, forCellReuseIdentifier: "myCell")
//類型轉(zhuǎn)換
vcType as! UIViewController.Type
private闲擦,internal慢味,public,open(3.0)墅冷,fileprivate(3.0)
這些保護(hù)作用域的關(guān)鍵字不能使用在方法內(nèi)部纯路,class內(nèi)推薦使用fileprivate
1、private
:作用域在當(dāng)前的{}
或者文件內(nèi)
2寞忿、fileprivate
:作用域在當(dāng)前文件驰唬,推薦使用
3、internal
:默認(rèn)作用域
4腔彰、public
:可以被任何人訪問叫编。但其他module中不可以被override和繼承,而在module內(nèi)可以被override和繼承
5霹抛、open
:可以被任何人使用搓逾,包括override和繼承
異常處理
在需要異常處理的函數(shù)方法聲明后面加throw關(guān)鍵字
在掉該方法的時(shí)候使用do{try}catch{}
try
//基本格式
do
{
//沒有異常的處理代碼
//將try關(guān)鍵字加在有throw關(guān)鍵字說明的函數(shù)調(diào)用前方空格隔開
}
catch
{
//處理異常,默認(rèn)的異常存儲(chǔ)變量為error
print(error)
}
//json序列化的例子
//1杯拐、獲取json數(shù)據(jù)
//1.1獲取json路徑
let path = NSBundle.mainBundle().pathForResource("MainVCSettings.json", ofType: nil)
//1.2獲取json數(shù)據(jù)
if let jsonPath = path
{
let jsonData = NSData(contentsOfFile: jsonPath)
//1.3json序列化
do
{
let arrJson = try NSJSONSerialization.JSONObjectWithData(jsonData!, options: NSJSONReadingOptions.MutableContainers)
// print(arrJson)
//2霞篡、便利數(shù)組
//swift中便利數(shù)組必須告知數(shù)組元素都是什么類型
for dict in arrJson as! [[String:String]]
{
// print(dict)
let vcName = dict["vcName"]
let title = dict["title"]
let imageName = dict["imageName"]
addChildViewController(vcName!, title: title!, imageName: imageName!)
}
}
catch
{
//沒有服務(wù)器數(shù)據(jù),創(chuàng)建本地控制器
addChildViewController("HomeTableViewController", title: "首頁(yè)", imageName:"tabbar_home")
addChildViewController("MessageTableViewController", title: "消息", imageName:"tabbar_message_center")
addChildViewController("DiscoverTableViewController", title: "發(fā)現(xiàn)", imageName:"tabbar_discover")
addChildViewController("ProfileTableViewController", title: "我", imageName:"tabbar_profile")
}
}