Swift day04 2016/1/21

今天去面試 ,沒聽課 ,根據(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子笛求,更是在濱河造成了極大的恐慌倒信,老刑警劉巖孩锡,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件顽决,死亡現(xiàn)場(chǎng)離奇詭異饺藤,居然都是意外死亡塔淤,警方通過查閱死者的電腦和手機(jī)阱飘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門斥杜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來虱颗,“玉大人,你說我怎么就攤上這事蔗喂⊥妫” “怎么了?”我有些...
    開封第一講書人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵缰儿,是天一觀的道長畦粮。 經(jīng)常有香客問我,道長乖阵,這世上最難降的妖魔是什么宣赔? 我笑而不...
    開封第一講書人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮瞪浸,結(jié)果婚禮上儒将,老公的妹妹穿的比我還像新娘。我一直安慰自己默终,他們只是感情好椅棺,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著齐蔽,像睡著了一般两疚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上含滴,一...
    開封第一講書人閱讀 52,736評(píng)論 1 312
  • 那天诱渤,我揣著相機(jī)與錄音,去河邊找鬼谈况。 笑死勺美,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的碑韵。 我是一名探鬼主播赡茸,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼祝闻!你這毒婦竟也來了占卧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤联喘,失蹤者是張志新(化名)和其女友劉穎华蜒,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體豁遭,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡叭喜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蓖谢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捂蕴。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡譬涡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出启绰,到底是詐尸還是另有隱情昂儒,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布委可,位于F島的核電站渊跋,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏着倾。R本人自食惡果不足惜拾酝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望卡者。 院中可真熱鬧蒿囤,春花似錦、人聲如沸崇决。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恒傻。三九已至脸侥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間盈厘,已是汗流浹背睁枕。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沸手,地道東北人外遇。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像契吉,于是被迫代替她去往敵國和親跳仿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容