Swift3.0 - 真的很簡單
Swift3.0 - 數(shù)據(jù)類型
Swift3.0 - Array
Swift3.0 - 字典
Swift3.0 - 可選值
Swift3.0 - 集合
Swift3.0 - 流控制
Swift3.0 - 對(duì)象和類
Swift3.0 - 屬性
Swift3.0 - 函數(shù)和閉包
Swift3.0 - 初始化和釋放
Swift3.0 - 協(xié)議protocol
Swift3.0 - 類和結(jié)構(gòu)體的區(qū)別
Swift3.0 - 枚舉
Swift3.0 - 擴(kuò)展
Swift3.0 - 下標(biāo)
Swift3.0 - 泛型
Swift3.0 - 異常錯(cuò)誤
Swift3.0 - 斷言
Swift3.0 - 自動(dòng)引用計(jì)數(shù)(strong,weak,unowned)
Swift3.0 - 檢測API
Swift3.0 - 對(duì)象的標(biāo)識(shí)
Swift3.0 - 注釋
Swift3.0 - 元類型
Swift3.0 - 空間命名
Swift3.0 - 對(duì)象判等
Swift3.0 - 探究Self的用途
Swift3.0 - 類簇
Swift3.0 - 動(dòng)態(tài)調(diào)用對(duì)象(實(shí)例)方法
Swift3.0 - 文本輸出
Swift3.0 - 黑魔法swizzle
Swift3.0 - 鏡像
Swift3.0 - 遇到的坑
- 存儲(chǔ)屬性
a.你應(yīng)該注意的
1.類和結(jié)構(gòu)體中,不能在枚舉中使用
2.不能被子類重寫,但可以在子類中給它添加監(jiān)測功能
b.定義
struct Range { // 結(jié)構(gòu)體定義存儲(chǔ)屬性
let first:Int
var length:Int
}
class Student{ // 類定義存儲(chǔ)屬性
var name:String!
var score:String!
}
- 計(jì)算屬性
a.能在哪里使用
類 搁料、結(jié)構(gòu)體摆马、枚舉
b.定義
1.結(jié)構(gòu)體使用
struct Range {
var first:Int
var length:Int
var myFirst:Int{ // 有setter 和 getter的計(jì)算屬性
set{
first = newValue
}
get{
return first
}
}
var myLength:Int{ // 只有g(shù)et方法計(jì)算屬性
get{
return length
}
}
}
2.枚舉中使用
enum Person : String{
case Man = "男"
case Women = "女"
// get
var name:String{
return self.rawValue
}
// setter getter
var rename:String{
set(newName){
self = Person(rawValue: newName)!
}
get{
return self.rawValue
}
}
}
var person = Person.Man
print(person.name)
person.rename = "女"
print(person.rawValue)
運(yùn)行結(jié)果:
男
女
提示:
1.如果計(jì)算屬性只有g(shù)etter 方法,那么這個(gè)get 可以被省略
2.setter 可以設(shè)置新值名字,如果沒有設(shè)置默認(rèn)為newValue
3.let 不能修飾計(jì)算屬性
-
監(jiān)測屬性
例子1:
class Circle{
var area:Double = 0.0
var r:Double = 0.0 {
willSet{
area = Double.pi*newValue*newValue
}
}
}
let circle = Circle()
circle.r = 10.0
print(circle.area)
運(yùn)行結(jié)果:
0.0
314.159265358979
例子2:
class Circle{
lazy var area: Double = 0.0
var r:Double = 0.0 {
willSet{
print("有新值")
area = Double.pi*newValue*newValue
}
}
}
let circle = Circle()
func calcalate(r:inout Double){
print("函數(shù)執(zhí)行開始")
r = 2.0
print("函數(shù)執(zhí)行結(jié)束")
}
calcalate(r: &circle.r)
運(yùn)行結(jié)果:
函數(shù)執(zhí)行開始
函數(shù)執(zhí)行結(jié)束
有新值
提示:
1.監(jiān)測屬性,其實(shí)是給存儲(chǔ)屬性上添加的一種監(jiān)測功能,willSet 監(jiān)測新值,didSet 監(jiān)測舊值
2.如果函數(shù)的參數(shù)是inout 修飾的,你如果將監(jiān)測的屬性傳入這個(gè)函數(shù)的時(shí)候,此時(shí)會(huì)將屬性的值拷貝一份,在函數(shù)結(jié)束的時(shí)候,將值重新付給屬性,所以函數(shù)執(zhí)行完畢后,會(huì)觸發(fā)監(jiān)測函數(shù)
- Lazy 關(guān)鍵字使用(只能用于存儲(chǔ)屬性)
使用時(shí)Lazy必須注意
1.只能用于存儲(chǔ)屬性
2.修飾的屬性必須有初始化
3.在結(jié)構(gòu)體中使用Lazy 修飾的屬性,在訪問的方法前必須加mutating 修飾
4.不能用于全局屬性或者靜態(tài)變量
5.存儲(chǔ)屬性被lazy修飾,只被初始化一次,在多線程訪問時(shí),不需要使用lazy標(biāo)記
例子:
struct Animal{
lazy var name = "動(dòng)物"
mutating func calculate(){
let name = self.name
}
var myName: String{ // 只有g(shù)et方法計(jì)算屬性
mutating get{
return name
}
}
- static 和 class 關(guān)鍵字的用法
相同點(diǎn):
1.可以修飾方法,static 修飾的方法叫做靜態(tài)方法,class修飾的叫做類方法
2.都可以修飾計(jì)算屬性
不同點(diǎn):
class 不能修飾存儲(chǔ)屬性
class 修飾的計(jì)算屬性可以被重寫,static 修飾的不能被重寫
static 可以修飾存儲(chǔ)屬性,static修飾的存儲(chǔ)屬性稱為靜態(tài)變量(常量)
static 修飾的靜態(tài)方法不能被重寫,class 修飾的類方法可以被重寫
class 修飾的類方法被重寫時(shí),可以使用static 讓方法變?yōu)殪o態(tài)方法
class 修飾的計(jì)算屬性被重寫時(shí),可以使用static 讓其變?yōu)殪o態(tài)屬性,但它的子類就不能被重寫了
class 只能在類中使用,但是static 可以在類,結(jié)構(gòu)體,或者枚舉中使用
下面是個(gè)例子:
class Person{
static var describe:String = " 這是一個(gè)人類"
class var score:Int{
return 0
}
// class 修飾的類方法可以被子類重寫,static 修飾的靜態(tài)方法不能被重寫
class func getScore()->Int{
return score
}
}
class Man: Person {
// 重寫計(jì)算屬性 可以使用static 來重寫哦,但是static 重寫后,就不能被它的子類再次重寫了
class override var score:Int{
return 1
}
// 重寫類方法時(shí)可以使用static 讓其變成靜態(tài)方法
static override func getScore()->Int{
return score
}
}
幫你擼清這些東西
1.參數(shù)是閉包執(zhí)行的結(jié)果 和 參數(shù)是閉包
class Person{
var name:String
var score:Int
init(name:String,score:Int) {
self.name = name
self.score = score
}
let describe: String = {
print("閉包已經(jīng)執(zhí)行")
return "我在\(getTime())被創(chuàng)建了"
}()
}
// 獲取時(shí)間
func getTime()-> Date{
return Date()
}
let p = Person(name: "酷走天涯", score: 3)
運(yùn)行結(jié)果:
閉包已經(jīng)執(zhí)行
Program ended with exit code: 0
分析:
屬性describe 是一個(gè)String 類型 ,獲取閉包函數(shù)執(zhí)行的結(jié)果
其實(shí)和下面的代碼是一個(gè)意思
class Person{
var name:String
var score:Int
init(name:String,score:Int) {
self.name = name
self.score = score
}
let describe: String = myDescribe()
}
// 獲取時(shí)間
func getTime()-> Date{
return Date()
}
func myDescribe()->String{
return "我在\(getTime())被創(chuàng)建了"
}
let p = Person(name: "酷走天涯", score: 3)
注意:
屬性 = 號(hào)后面的函數(shù)不能定義在類內(nèi),因?yàn)槌跏蓟赐瓿芍笆遣荒苷{(diào)用對(duì)象方法的
接下來我們看參數(shù)是閉包
class Person{
var name:String
var score:Int
init(name:String,score:Int) {
self.name = name
self.score = score
}
// 注意看和上面的區(qū)別
let describe: ()->String = {
print("閉包被執(zhí)行了")
return "我在\(getTime())被創(chuàng)建了"
}
}
// 獲取時(shí)間
func getTime()-> Date{
return Date()
}
func myDescribe()->String{
return "我在\(getTime())被創(chuàng)建了"
}
let p = Person(name: "酷走天涯", score: 3)
運(yùn)行結(jié)果:
啥都沒有
分析:
屬性describe 是一個(gè)()->String 類型,后面跟的是他的值,它的值剛好是一個(gè)閉包類型 ,但是沒有執(zhí)行,我們讓它執(zhí)行一下
添加下面代碼
let pd = p.describe()
運(yùn)行結(jié)果
閉包被執(zhí)行了
Program ended with exit code: 0
其實(shí)我們還可以使用下面的等價(jià)代碼
class Person{
var name:String
var score:Int
init(name:String,score:Int) {
self.name = name
self.score = score
}
let describe: ()->String = myDescribe
}
// 獲取時(shí)間
func getTime()-> Date{
return Date()
}
func myDescribe()->String{
return "我在\(getTime())被創(chuàng)建了"
}
let p = Person(name: "酷走天涯", score: 3)
let pd = p.describe()
搞清楚上面兩者的區(qū)別,我們做一個(gè)練習(xí)
需求: 有個(gè)自定義類,類中有一個(gè)數(shù)組,數(shù)組中包含20位斐波那契數(shù)列
class Calculate{
var fibo:[Int] = {
// 定義一個(gè)數(shù)組
var nums:[Int] = []
func Func(n:Int)->Int{
if n < 2{
return n
}else{
return Func(n: n-1)+Func(n: n-2)
}
}
for i in 0..<20{
nums.append(Func(n: i))
}
return nums
}()
}
let c = Calculate()
print(c.fibo)
運(yùn)行結(jié)果:
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181]
Program ended with exit code: 0