今天去面試 ,沒聽課 ,根據(jù)上課講得做下筆記.
1. 閉包,(類似 OC 中的 Block) 是將一段代碼封裝起來,變成一個(gè)類型變量的東西,可以作為參數(shù)傳遞,類似一個(gè)沒有名字的函數(shù). swift 中閉包就是函數(shù),但比函數(shù)更加靈活.
//輸入輸出參數(shù) (相當(dāng)于地址傳遞) 選擇
func selectSort(inout data : [Int], function : (Int,Int)->Bool ) {
for var i = 0; i < data.count - 1;i++ {
//記錄最小下標(biāo)
var k = i //假設(shè) i 位置最小
for var j = i + 1; j < data.count; j++ {
// if data[j] > data[k] {
if function(data[j], data[k]) {
k = j
}
} //循環(huán)是找到最小的值的下標(biāo)
if k != i { //如果假設(shè)對(duì)了,不用交換
swap(&data[k], &data[i])
}
}
}
//func rule(a : Int,_ b : Int) ->Bool {
// return a > b
//}
//func rule2(a : Int,_ b : Int) ->Bool {
// return a < b
//}
var data = [9, 3, 5, 1, 2, 6, 8, 7, 4, 3]
//selectSort(&data,function: rule2)
/*
語法:
{
(parameters 參數(shù)列表)->returnType返回值類型 in
code
return xxxx
}
*/
selectSort(&data, function:
{
(a : Int, b : Int)->Bool in
return a > b
})
data
//閉包可以縮寫 或 省略
//參數(shù)類型可以省略
selectSort(&data, function:
{
(a, b)->Bool in
return a > b
})
//返回值類型可以省略
selectSort(&data, function:
{
(a, b) in
return a > b
})
//如果只有一條語句 return 可以省略
selectSort(&data, function:{(a, b) in a > b })
//參數(shù)名可以省略 $0是傳入的第一個(gè)參數(shù) $1是傳入的第二參數(shù)
selectSort(&data, function:{ $0 < $1 })
//甚至可以直接省略掉參數(shù)
selectSort(&data, function:>)
//map 方法, 把數(shù)組每個(gè)元素取出放到閉包函數(shù)中執(zhí)行, 把所有的執(zhí)行結(jié)果放到一個(gè)新的數(shù)組
var newNums = numbers.map({
(number : Int) ->Int in
var n = number + 20
return n
})
//拖尾閉包, 如果一個(gè)函數(shù)的最后一個(gè)參數(shù)傳入的是閉包函數(shù),可以寫在()外面,如果只有個(gè)一個(gè)參數(shù)() 可以省略
var newNums2 = numbers.map{
(number : Int) ->Int in
var n = number + 20
return n
}
2.enum
枚舉中可以有方法
enum ConpassPoint {
case North
case South
case East
case West
func show(){
print(self)
}
}
var p = CompassPoint.North
p.show()
enum CompassPoint2{
case North, South, East, West
}
//聲明一個(gè)枚舉變量
var point : CompassPoint
//給一個(gè)枚舉變量初始化
point = CompassPoint.North
point = .South //沒有枚舉的名字,通過上下文環(huán)境找到對(duì)應(yīng)的枚舉
//原始值 (裸值)
enum Week : Int{
case Sun = 0, Mon, Tur, Wen, Thu, Fri, Sat
}
// C 中可以 int week = Sun
//Swift 中 枚舉值不能直接當(dāng)做Int使用, 如果需要當(dāng)做Int使用,可以使用枚舉的原始值(裸值)
var week : Int = Week.Sun.rawValue //用原始值給 Int 賦值
var week2 : Week? = Week(rawValue: 0)
//關(guān)聯(lián)值
enum Barcode {
case UPCA(Int,Int,Int) //條形碼
case QRCode(String) //二維碼
}
var barcode = Barcode.UPCA(690, 690740102, 2)
barcode = Barcode.QRCode("ajkdlsjflkdsjf")
switch barcode {
case Barcode.UPCA(let(num, id, check)):
print("這是一個(gè)條形碼\(num)-\(id)-\(check)")
case Barcode.QRCode(let string):
print("這是一個(gè)二維碼 對(duì)應(yīng)的字符串是 \(string)")
}
3.類和結(jié)構(gòu)體
相同點(diǎn):
1.類和結(jié)構(gòu)體都是在定義一種類型
2.都可以在內(nèi)部定義屬性和方法
3.都可以定義下標(biāo)運(yùn)算符
4.都可以定義初始化方法(初始化器, 構(gòu)造器, init)
5.都可以擴(kuò)展現(xiàn)有功能 (類似OC中Category 分類, swift中沒有分類)
6.都可以遵守指定的協(xié)議
不同點(diǎn):
1.類可以繼承, 結(jié)構(gòu)體不可以繼承
2.類有多態(tài), 結(jié)構(gòu)體沒有多態(tài)
3.類的內(nèi)存管理支持自動(dòng)引用計(jì)數(shù)器,而結(jié)構(gòu)體的內(nèi)存不使用引用計(jì)數(shù)器, 結(jié)構(gòu)體的變量都是在棧中分配的,出了作用域會(huì)自動(dòng)釋放,棧中的空間不需要我們管理
4.類是引用類型, 結(jié)構(gòu)體是值類型
//類中的屬性聲明時(shí)必須初始化, 除非它是可選值
class VideoMode {
var resolution = Resolution()
var interloaced = false
var frameRate = 0.0
var name : String? //可選值
}
//結(jié)構(gòu)是值類型,類是引用類型
var res = Resolution() //值類型
var res2 = res
res.width = 500
res.width
res2.width
var vmode = VideoMode() //引用類型
var vmode2 = vmode
vmode.name = "張三"
vmode.name
vmode2.name
//實(shí)際上是比地址 === 相等 !== 不等
if vmode !== vmode2 {
print("兩個(gè)引用 引用了不是同一塊地址")
}
var rect = Rect(origin: Point(x: 100, y: 100), size: Size(w: 500, h: 500))
print("矩形的原點(diǎn)x是\(rect.origin.x), y是\(rect.origin.y)")
//結(jié)構(gòu)體是用來封裝少量簡(jiǎn)單的數(shù)據(jù)
//最簡(jiǎn)單的像 幾何圖形 CGPoint CGRect CGSize
let cgPoint = CGPoint(x: 100, y: 200)
4.Properties屬性
Swift屬性 有兩個(gè)分類方式
第一種分類方式 :
存儲(chǔ)屬性 (Stored Properties)
用變量或常量保存屬性的值
計(jì)算屬性 (Calculate Properties)
不用變量或常量保存屬性值, 值是通過計(jì)算的出的
出生日期 : 儲(chǔ)存屬性
年齡 : 計(jì)算屬性 是通過 當(dāng)前日期 - 出生日期計(jì)算出來的
第二種分類方式:
實(shí)例屬性 和 類型屬性
屬性的附加: 屬性監(jiān)視器 (properties observer)
用于探知屬性的值是否發(fā)生了變化
struct FixedLengthRange {
//存儲(chǔ)屬性 用一個(gè)變量或常量保存屬性的值
var firstValue : Int
let length : Int //逐一初始化器 也可以給常量初始化
}
var flr = FixedLengthRange(firstValue: 0, length: 3)
class DataManager {
//延遲屬性 類似OC 中的懶加載 或 延遲加載的功能
lazy var dataImporter = DataImporter()
var data = [String]()
}
計(jì)算屬性
/******* 計(jì)算屬性 ***************/
struct Point{
var x = 0.0, y = 0.0
}
struct Size {
var w = 0.0, h = 0.0
}
struct Rect {
//存儲(chǔ)屬性
var origin = Point()
var size = Size()
//計(jì)算屬性
//只有g(shù)et 是只讀計(jì)算屬性, 如果有g(shù)et set 是可讀寫計(jì)算屬性
var center : Point {
get{
let centerX = origin.x + size.w * 0.5
let centerY = origin.y + size.h * 0.5
return Point(x : centerX,y : centerY)
}
set /*(newCenter) 如果這里沒有任何接收 默認(rèn)使用 newValue*/ {
let newOriginx = newValue.x - size.w * 0.5
let newOriginy = newValue.y - size.h * 0.5
origin = Point(x: newOriginx, y: newOriginy)
}
}
//計(jì)算屬性 只讀計(jì)算屬性如果只有一行代碼 get 可以省略
var center2 : Point {
/*get {*/
return Point(x: 500 + 100, y: 500 + 100)
/*}*/
}
}
var rect = Rect(origin: Point(x: 0, y: 0), size: Size(w: 300, h: 300))
rect.center.x
rect.center.y
rect.center = Point(x :200, y : 200)
rect.origin.x
rect.origin.y