Swift第三周學(xué)習(xí)心得

Swift第三周學(xué)習(xí)心得

第三周主要學(xué)習(xí)了關(guān)于以下幾種知識(shí)

一具温、數(shù)組的三種重要方法

關(guān)于數(shù)組的運(yùn)用有三種重要的方法

1.過(guò)濾 (留下滿足要求的)

let array = [23, 37, 96, 55, 40, 92, 68, 88]
let newArray = array.filter { (n : Int) -> Bool in
   return n > 50
}
print(newArray)

let newArray2 = array.filter { (n) -> Bool in
    return n % 2 == 0
}
print(newArray2)

關(guān)鍵字-filter

2.映射 (對(duì)原來(lái)的數(shù)組進(jìn)行你給的要求的變化變成新的數(shù)組)

let array = [23, 37, 96, 55, 40, 92, 68, 88]
let newArray3 = array.map { (n : Int) -> Int in
    return n * n
}
print(newArray3)

關(guān)鍵字-map

3.縮減(規(guī)約)

let result1 = array.reduce(0, combine: +)   //初始值  縮減(規(guī)約)的方法
let result2 = array.reduce(0, combine: *)
let result3 = array[1..<array.count].reduce(array[0]) { $1 > $0 ? $1 : $0 }
print(result3)

關(guān)鍵字-reduce

二梁沧、閉包

如果函數(shù)的最后一個(gè)參數(shù)是閉包可以寫(xiě)成尾隨閉包的形式
也就是將閉包放到函數(shù)參數(shù)的圓括號(hào)外面寫(xiě)在一對(duì)花括號(hào)中
如果函數(shù)后面有尾隨閉包且函數(shù)的圓括號(hào)中沒(méi)有參數(shù)
那么函數(shù)的圓括號(hào)也可以省略(僅限于有尾隨閉包的場(chǎng)景)
閉包函數(shù)有很多種省略的方法

var array = ["game", "abacus", "hello", "cat", "good", "internationalization", "chaos", "dislike", "zealot", "young"]
array.sortInPlace {
    if $0.characters.count == $1.characters.count {
        return $0 < $1
    }
    return $0.characters.count < $1.characters.count
}
print(array)

三、集合

集合與數(shù)組一樣都是存放數(shù)據(jù)的方式,但不同的是集合內(nèi)存放的元素是不能重復(fù)的夜涕,并且他們的存儲(chǔ)也不是按順序存儲(chǔ)的挟裂,反而是通過(guò)哈希計(jì)算隨機(jī)存儲(chǔ)

var b : Set<Int> = [1, 2, 3, 1, 2, 5]   //集合
var c : Set<Int> = [3, 5, 7, 9, 11]
print(b)
print(b.intersect(c))  //交集 b和c都有的
print(b.union(c))      //并集 b和c所有的
print(b.subtract(c))   //差集 b有c沒(méi)有

遍歷集合

for x in b{
    print(x)
}
b.insert(6)          //添加元素
b.remove(2)          //刪除元素

四、字典

字典是存放鍵值對(duì)組合的容器
字典中的每個(gè)元素都是由兩個(gè)部分構(gòu)成割岛,冒號(hào)前面是鍵愉适,后面是值

var dict = ["abacus": "算盤(pán)", "abnormal": "異常", "hello": "你好", "good": "很好"]
//key --> value
//通過(guò)鍵值獲取對(duì)應(yīng)值(可空類(lèi)型,因?yàn)榻o的鍵有可能沒(méi)有與之對(duì)應(yīng)的值)
print(dict["hello"]) //]后加感嘆號(hào)癣漆,如果找不到值维咸,程序就出錯(cuò)。
//添加元素
dict["shite"] = "嘟嘟"
//刪除元素
dict.removeValueForKey("hello") // or dict["hello"] = nil
//修改值就重新賦值
dict["good"] = "不好"
//遍歷一個(gè)字典
//遍歷字典中所有的值
for value in dict.values{
    print(value)
}
//遍歷字典中所有的鍵
for key in dict.keys{
    print("\(key) ---> \(dict[key])")
}
//最常用惠爽,通過(guò)元組獲得字典中的鍵和值癌蓖。
for (key, value) in dict{
    print("\(key) ---> \(value)")
}

五、函數(shù)

定義一個(gè)函數(shù)
func 函數(shù)名(參數(shù)列表) -> 返回類(lèi)型{函數(shù)執(zhí)行體}
可以給函數(shù)的參數(shù)設(shè)定默認(rèn)值婚肆,如果調(diào)用函數(shù)的時(shí)候沒(méi)有給該參數(shù)賦值就直接使用默認(rèn)值

func sayhello(personName : String, _ alreadyHello : Bool = false) ->String{  // 可以加默認(rèn)值
    //let hello = "hello, " + personName + "!"
    //如果函數(shù)的返回類(lèi)型不是void费坊,那么函數(shù)中一定有return語(yǔ)句
    //return "hello, " + personName + "!"
    //return hello
    if alreadyHello{
        return "又是你" + personName + "!"
    }
    else {
        return "hello" + personName
    }
}

調(diào)用函數(shù),直接寫(xiě)函數(shù)名字傳參數(shù) -- 函數(shù)名(參數(shù)組)
調(diào)用Swit的函數(shù)時(shí)旬痹,在默認(rèn)情況下從第二個(gè)參數(shù)開(kāi)始需要寫(xiě)參數(shù)名

print(sayhello("qqq", true))
//沒(méi)給第二個(gè)參數(shù)賦值,直接使用默認(rèn)你。再寫(xiě)上參數(shù)和默認(rèn)值一樣的也可以
print(sayhello("qq"))

//let str = sayhello("qq")
//print(str)


函數(shù)的參數(shù)名
函數(shù)名(外部參數(shù)名 內(nèi)部參數(shù)名 : 類(lèi)型, 外部參數(shù)名 內(nèi)部參數(shù)名 : 類(lèi)型)
如果不寫(xiě)外部參數(shù)名,那么內(nèi)部參數(shù)名也就是外部參數(shù)名
可以用_來(lái)作為外部參數(shù)名表示省略外部參數(shù)名

func myMin(x : Int, _ y : Int) -> Int{ // 調(diào)用不想寫(xiě)y 就在y前面寫(xiě) _ y 省略外部參數(shù)名
    return x < y ? x : y
}
//調(diào)用函數(shù)寫(xiě)外部參數(shù)名
print(myMin(3, 5))


函數(shù)的參數(shù)列表是可變的慈迈,稱可變參數(shù)列表,函數(shù)參數(shù)個(gè)數(shù)是任意個(gè)

func sum1(nums: Int...) -> Int{
    var total = 0
    for num in nums{
        total += num
    }
    return total
}
print(sum1())
print(sum(1,2,3))
print(sum1(11,12,12,23,44,56))

六蠢沿、類(lèi)

1.定義類(lèi)(如果你要用的類(lèi)蘋(píng)果已經(jīng)提供了就直接進(jìn)入第2步)

0.發(fā)現(xiàn)類(lèi)

  • 在對(duì)問(wèn)題的描述里面找名次和動(dòng)詞
  • 名詞會(huì)成為類(lèi)或者類(lèi)中的屬性面哼,動(dòng)詞會(huì)成為類(lèi)中的方法

1.定義類(lèi)

  • 數(shù)據(jù)抽象(屬性)
  • 行為抽象(方法)
  • 初始化方法

訪問(wèn)修飾符

  • public(公開(kāi)代乃,別的項(xiàng)目也能用)
  • interna(內(nèi)部的) - 默認(rèn)
  • private(私有吭历,外界不讓訪問(wèn))
  • 修飾符可以加在類(lèi),屬性,方法前面,但公開(kāi)只能先公開(kāi)類(lèi)旭斥,再公開(kāi)別的

定義類(lèi)就可以創(chuàng)建出新的類(lèi)型

 學(xué)生類(lèi)
class Student {
    // 變量定義到類(lèi)的外面就叫變量 - variable
    // 變量定義到類(lèi)的里面就叫屬性 - property
    // 數(shù)據(jù)抽象 - 找到和學(xué)生相關(guān)的屬性(找名詞)
    var name: String
    var age: Int
    
    // 初始化方法(構(gòu)造方法/構(gòu)造器) - constructor
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
    
    // 函數(shù)寫(xiě)到類(lèi)的外面就叫函數(shù) - function
    // 函數(shù)寫(xiě)到類(lèi)的里面就叫方法 - method
    // 行為抽象 - 找到和學(xué)生相關(guān)的方法(找動(dòng)詞)
    func eat() {
        print("\(name)正在吃飯.")
    }
    
    func study(courseName: String) {
        print("\(name)正在學(xué)習(xí)\(courseName).")
    }
    
    func watchJapaneseAV() {
        if age >= 18 {
            print("\(name)正在觀看島國(guó)愛(ài)情動(dòng)作片.")
        }
        else {
            print("親愛(ài)的\(name), 我們推薦你觀看《熊出沒(méi)》")
        }
    }
}

步驟2: 創(chuàng)建對(duì)象(調(diào)用初始化方法)

let stu1 = Student(name: "駱昊", age: 35)

步驟3: 給對(duì)象發(fā)消息(通過(guò)給對(duì)象發(fā)消息來(lái)解決問(wèn)題)

stu1.eat()
stu1.study("Swift程序設(shè)計(jì)")
stu1.watchJapaneseAV()

let stu2 = Student(name: "王大錘", age: 15)
stu2.eat()
stu2.study("中國(guó)近代史")
stu2.watchJapaneseAV()

類(lèi)是面對(duì)對(duì)象編程很重要的部分卒暂。在我的理解中啄栓,面對(duì)對(duì)象編程的對(duì)象就是通過(guò)類(lèi)具體化得到的。我們說(shuō)的類(lèi)事包含很多屬性方法的抽象的一個(gè)合集也祠,我們從中具體化(創(chuàng)建)一個(gè)對(duì)象出來(lái)對(duì)它發(fā)消息昙楚,消息的內(nèi)容就是我們希望對(duì)象完成的事。

2.創(chuàng)建一個(gè)類(lèi)基本上要經(jīng)過(guò)三個(gè)步驟

數(shù)據(jù)抽象-初始化所有存儲(chǔ)屬性-行為抽象

class Robot {
    // 數(shù)據(jù)抽象
    var answer : Int            // 正確答案
    var counter : Int           // 猜的次數(shù)
    var hint : String           // 提示信息
    
    //對(duì)所有存儲(chǔ)屬性都要初始化(有初始值诈嘿,默認(rèn)值)
    init(){
        answer = Int(arc4random_uniform(100)) + 1
        counter = 0
        hint = ""
    }
    
    // 行為抽象
    // 判斷
    func judge(qqq : Int) -> Bool{
        counter += 1
        if qqq < answer{
            hint = "大一點(diǎn)"
        }
        else if qqq > answer{
            hint = "小一點(diǎn)"
        }
        else{
            hint = "恭喜你猜對(duì)了堪旧!你總共猜了\(counter)次"
            return true
        }
        return false
    }
}

swift里把得到某個(gè)值的方法就用名次做方法名,但也能寫(xiě)成如下
通常獲得某個(gè)計(jì)算出來(lái)的值的方法都可以設(shè)計(jì)成計(jì)算屬性
計(jì)算屬性(通過(guò)對(duì)存儲(chǔ)屬性做運(yùn)算得到的屬性)

3.類(lèi)的擴(kuò)展

類(lèi)的擴(kuò)展也是很重要的一個(gè)部分
擴(kuò)展,不要改原來(lái)的類(lèi)奖亚,神噩夢(mèng)時(shí)候用就在用的地方擴(kuò)展
如果在某個(gè)特定的應(yīng)用場(chǎng)景中你發(fā)現(xiàn)現(xiàn)有的類(lèi)缺少了某項(xiàng)功能
那么可以通過(guò)類(lèi)的擴(kuò)展(extension)的方式現(xiàn)場(chǎng)添加這項(xiàng)功能
關(guān)鍵字 extension 類(lèi)名

extension Point{
   var cgPoint: CGPoint{
       get {
           return CGPointMake(CGFloat(x), CGFloat(y))
       }
   }
}

class Triangle {
   var va: Point
   var vb: Point
   var vc: Point
   var color : UIColor?
   
   init(va : Point, vb: Point, vc: Point){
       self.va = va
       self.vb = vb
       self.vc = vc
   }
   
   var perimeter: Double{
       get{
           let ab = va.distentsTo(vb)
           let bc = vb.distentsTo(vc)
           let ac = vc.distentsTo(va)
           return ab + bc + ac
       }
   }
   
   var area: Double{
       get{
           let ab = va.distentsTo(vb)
           let bc = vb.distentsTo(vc)
           let ac = vc.distentsTo(va)
           let halfp = perimeter / 2
           return sqrt(halfp * (halfp - ab) * (halfp - bc) * (halfp - ac))
       }
   }
   
   func draw(){
       let bezierPath = UIBezierPath()
       bezierPath.moveToPoint(va.cgPoint)
       bezierPath.addLineToPoint(vb.cgPoint)
       bezierPath.addLineToPoint(vc.cgPoint)
       bezierPath.addLineToPoint(va.cgPoint)
      
       //color?.set()
       
//        if let color = color{
//            color.set()
//        }
//        else{
//            UIColor.blueColor().set()
//        }
       
       //let nowcolor = color == nil ? UIColor.blueColor() : color!
       
       //如果為空用??后面的值淳梦,不為空就直接用??前面的值,也就是它本身的值
       let currentColor = color ?? UIColor.blueColor()
       currentColor.set()
       
       // 上面寫(xiě)法的升級(jí)版
       //(color ?? UIColor.blueColor()).set()
       
       bezierPath.stroke()
   }
}

4.類(lèi)的繼承

從已有的類(lèi)創(chuàng)建出新類(lèi)的過(guò)程
提供繼承信息的類(lèi)稱為父類(lèi)(超類(lèi)/基類(lèi))
得到繼承信息的類(lèi)稱為子類(lèi)(派生類(lèi)/衍生類(lèi))
通常子類(lèi)除了得到父類(lèi)的繼承信息還會(huì)增加一些自己特有的東西
所以子類(lèi)的能力一定比父類(lèi)更強(qiáng)大

繼承的意義在于子類(lèi)可以復(fù)用父類(lèi)的代碼并且增強(qiáng)系統(tǒng)現(xiàn)有的功能昔字、

class Student: Person {
    var major: String
    
    init(name: String, age: Int, gender: Gender, major: String){
        self.major = major
        //
        super.init(name: name, age: age, gender: gender)
    }
    
    func study(courseName: String){
        print("\(name)是\(major)專業(yè)的學(xué)生")
        print("\(name)是\(gender == .Male ? "男" : "女")")
        print("\(name)正在學(xué)\(courseName)")
    }
}

我們可以將子類(lèi)型的對(duì)象賦值給父類(lèi)型的變量(因?yàn)樽宇?lèi)跟父類(lèi)之間時(shí)is-a關(guān)系)
學(xué)生是人爆袍,老師是人,所以學(xué)生和老師的對(duì)象可以賦值給人類(lèi)型的變量

如果要將父類(lèi)型的變量轉(zhuǎn)換為子類(lèi)型需要使用as運(yùn)算符進(jìn)行類(lèi)型轉(zhuǎn)換
如果能夠確認(rèn)父類(lèi)型的變量中就是某子類(lèi)型的對(duì)象可以用as!進(jìn)行轉(zhuǎn)換
如果不能確定父類(lèi)型的變量中時(shí)那種子類(lèi)型可以用as?嘗試轉(zhuǎn)換

let p2: Person = Student(name: "klle", age: 21, gender: .Female, major: "計(jì)算機(jī)")
p2.eat()
(p2 as! Student).study("社會(huì)學(xué)")

if let tmp = p2 as? Teacher{
    tmp.teach("Java")
}
else{
    print("\(p2.name)不是老師作郭!")
}

let p3 = Teacher(name: "ollp", age: 35, gender: .Male, title: "渣渣")
p3.eat()
p3.teach("補(bǔ)到")

注意


if let tmp = p2 as? Teacher

p2是Person類(lèi)陨囊,我們定義一個(gè)tmp代表P2,嘗試將其轉(zhuǎn)換成tercher類(lèi)夹攒,用If- As蜘醋?的方法,如果能轉(zhuǎn)咏尝,tmp就能調(diào)用teacher類(lèi)的方法那些压语,不能轉(zhuǎn)換也不影響

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市编检,隨后出現(xiàn)的幾起案子胎食,更是在濱河造成了極大的恐慌,老刑警劉巖蒙谓,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件斥季,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡累驮,警方通過(guò)查閱死者的電腦和手機(jī)酣倾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)谤专,“玉大人躁锡,你說(shuō)我怎么就攤上這事≈檬蹋” “怎么了映之?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵拦焚,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我杠输,道長(zhǎng)赎败,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任蠢甲,我火速辦了婚禮僵刮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鹦牛。我一直安慰自己搞糕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布曼追。 她就那樣靜靜地躺著窍仰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪礼殊。 梳的紋絲不亂的頭發(fā)上驹吮,一...
    開(kāi)封第一講書(shū)人閱讀 49,816評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音膏燕,去河邊找鬼钥屈。 笑死悟民,一個(gè)胖子當(dāng)著我的面吹牛坝辫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播射亏,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼近忙,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了智润?” 一聲冷哼從身側(cè)響起及舍,我...
    開(kāi)封第一講書(shū)人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎窟绷,沒(méi)想到半個(gè)月后锯玛,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡兼蜈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年攘残,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片为狸。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡歼郭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出辐棒,到底是詐尸還是另有隱情病曾,我是刑警寧澤牍蜂,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站泰涂,受9級(jí)特大地震影響鲫竞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜逼蒙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一贡茅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧其做,春花似錦顶考、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蹈胡,卻和暖如春渊季,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背罚渐。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工却汉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人荷并。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓合砂,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親源织。 傳聞我的和親對(duì)象是個(gè)殘疾皇子翩伪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類(lèi)相關(guān)的語(yǔ)法谈息,內(nèi)部類(lèi)的語(yǔ)法缘屹,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法侠仇,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,598評(píng)論 18 399
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理轻姿,服務(wù)發(fā)現(xiàn),斷路器逻炊,智...
    卡卡羅2017閱讀 134,633評(píng)論 18 139
  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說(shuō)閱讀 10,928評(píng)論 6 13
  • 周日互亮,零下四度,寒冬嗅骄,早晨胳挎。 輕坐于咖啡店,不看任何八卦和文字溺森,塞上耳機(jī)慕爬,臨座于窗前窑眯,看著路邊形形...
    花開(kāi)盛夏903閱讀 182評(píng)論 0 0