MG--Swift3.x進(jìn)階語法學(xué)習(xí)2

  • 最喜歡Swift的類型轉(zhuǎn)換和過濾數(shù)組():

    • 為什么呢?看了下面的例子你就明白了,看Swift和Objective-C的對(duì)比
  • Swift

let myCustomViews = self.subViews.flatMap { 
          $0 as MyCustomView 
}
  • OC

NSArray<MyCustomView *> *myCustomViews = (NSArray<MyCustomView *> *) [self.subViews filteredArrayUsingPredicate: [NSPredicate predicateWithBlock:^BOOL(id _Nonnull evaluatedObject, NSDictionary<NSString *,id> * _Nullable bindings) {                     
           return [evaluatedObject isKindOfClass:[MyCustomView class]];            
        }]
];



  • 一灭必、數(shù)組

  • 1.數(shù)組的初始化

  • Easily my favorite initializer for strings and array is count:repeatedValue:


    String的count:repeatedValue:初始化一個(gè)字符串
    初始化一個(gè)一維數(shù)組和二維數(shù)組
  • 2.進(jìn)制轉(zhuǎn)換>

  • 十進(jìn)制的轉(zhuǎn)化

String(12, radix: 16)   // 十進(jìn)制轉(zhuǎn)16進(jìn)制
String(12, radix: 8)   // 十進(jìn)制轉(zhuǎn)8進(jìn)制
String(12, radix: 2)   // 十進(jìn)制轉(zhuǎn)2進(jìn)制
String(12, radix: 4)   // 十進(jìn)制轉(zhuǎn)4進(jìn)制
進(jìn)制轉(zhuǎn)換結(jié)果
  • 其他進(jìn)制的轉(zhuǎn)化

// 數(shù)字轉(zhuǎn)化后的字母是否需要大小寫 
 // str設(shè)置為“1 c”播瞳。如果你喜歡——即“1 C”掸刊。,大寫
String(28, radix: 16, uppercase: true)  // 打印結(jié)果:"1C"
String(18, radix: 16, uppercase: true)  // 打印結(jié)果:"12"
// 字符串轉(zhuǎn)化  (轉(zhuǎn)換回一個(gè)整數(shù)——記住,可選!)
let int = Int("1C", radix: 16)          // 打印結(jié)果:28
其他進(jìn)制的轉(zhuǎn)化

  • 3.數(shù)組和集合的轉(zhuǎn)化

let scores = [5, 3, 6, 1, 3, 5, 3, 9, 6] // 數(shù)組
let scoresSet = Set(scores)              // 集合,從打印結(jié)果看出不會(huì)重復(fù),且集合是無序的
let uniqueScores = Array(scoresSet)      // 從集合中創(chuàng)建一個(gè)數(shù)組
數(shù)組和集合的轉(zhuǎn)化

  • 4.枚舉

    • 寫法1:

enum Color {
        case Unknown
        case Blue
        case Green
        case Pink
        case Purple
        case Red
}
  • 寫法2:更偏向于第2種寫法

enum Color {
            case Unknown, Blue, Green, Pink, Purple, Red
}
  • 具體使用場(chǎng)景:

  • 創(chuàng)建一個(gè)結(jié)構(gòu)體赢乓,有名字和color忧侧。它會(huì)自動(dòng)生成構(gòu)造方法

struct Boy {
        let name: String
        let color: Color
}
  - 如何使用:我們不需要使用UIColor. Pink石窑,可以直接.Pink
let 明哥 = Boy(name: "明哥", color: . Green)
let 路西 = Boy(name: "My Girl Friend", color: . Purple)
它會(huì)自動(dòng)生成構(gòu)造方法
舉個(gè)
  • Raw values

enum Planet: Int {  // 枚舉
            case Mercury = 1 ,Venus ,Earth ,Mars ,Unknown
}
let ttt = Planet.Earth.rawValue  // 是可選值,不一定有
let mars = Planet(rawValue: 4) ?? Planet.Unknown  // 打印Mars
let mars1 = Planet(rawValue: 7) ?? Planet.Unknown  // 打印Unknown 
  • 值得注意的是:枚舉:如果枚舉沒有指定類型

enum Color {
             case Unknown, Blue, Green, Pink, Purple, Red
}
let pink = Color.Pink. rawValue   // 這樣會(huì)報(bào)錯(cuò)苍柏,需改為Color.Pink. hasValue
  // 改為Color.Pink. hasValue == 打印出來的是3 // 從結(jié)果可以看出尼斧,也就是說默認(rèn)會(huì)從0開頭算起
改為Color.Pink. hasValue == 打印出來的是3
  • 枚舉:指定是String類型

enum Color: String {
             case Unknown, Blue, Green, Pink, Purple, Red
}
MYColor.Pink.rawValue // 打印出來是"Pink"
枚舉:指定是String類型



  • 二姜贡、數(shù)組排序

    • 默認(rèn)排序:升序

 let names = ["Dabitha", "Taylor", "Ahomas", "Ximothy", "Hobias", "Tyler"]    names.sorted()
    let numbers = [5, 3, 1, 9, 5, 2, 7, 8]
    let lowest = numbers.min() // 找出最小值1 
    let highest = numbers.max() // 找出最大值9
    numbers.sorted() //排序 
打印結(jié)果
  • 升序和降序的可掌控

let names = ["Dabitha", "Taylor", "Ahomas", "Ximothy", "Hobias", "Tyler"]
let sortNames = names.sorted {
        print("Comparing \($0) and \($1)")
        if ($0 == "Ximothy") {
            return true
        }  else {
            return $0 < $1
        }
}
print(sortNames)
數(shù)組排序
  • 操作符重載

  • 控制器外邊方法

struct Dog: Comparable {
        var breed: String
        var age: Int
}
func <(lhs: Dog, rhs: Dog) -> Bool {
        return lhs.age < rhs.age
}
func ==(lhs: Dog, rhs: Dog) -> Bool {
        return lhs.age == rhs.age
}
- ####控制器viewDidLoad()方法中
override func viewDidLoad() {
        super.viewDidLoad()
        let poppy = Dog(breed: "Poodle", age: 5)
        let rusty = Dog(breed: "Labrador", age: 2)
        let rover = Dog(breed: "Corgi", age: 11) 
        let dogs = [poppy, rusty, rover] 
        let newDogs = dogs.sorted()
        print("排序前:\(dogs)")
        print("=============") 
        print("排序后:\(newDogs)")
    }
打印結(jié)果
  • 數(shù)組的增加试吁、刪除和插入

  • + 增加 數(shù)組與數(shù)組的增加

let poppy = Dog(breed: "Poodle", age: 5)
let rusty = Dog(breed: "Labrador", age: 2)
let rover = Dog(breed: "Corgi", age: 11)
var dogs = [poppy, rusty, rover]
let beethoven = Dog(breed: "St Bernard", age: 8)dogs += [beethoven] // 拼接一個(gè)數(shù)組等價(jià)于dogs.append(contentsOf: [beethoven])
dogs.append(Dog(breed: "xiaohua", age: 3)) // 拼接一個(gè)元素
  • - 刪除 主要講解刪除最后一個(gè)元素

    • removeLast() 和popLast()兩者都是刪除最后一個(gè)元素并返回刪除的對(duì)象。唯一的區(qū)別看下圖打印可知楼咳,popLast()刪除返回的對(duì)象是可選值熄捍。如果數(shù)組中有空值(nil)的時(shí)候,使用removeLast()母怜,程序就會(huì)崩潰余耽。所以如果你的數(shù)組中有可能是空值,當(dāng)你嘗試刪除一個(gè)條目,使用popLast()苹熏,您可以安全地檢查返回值:if let dog = dogs.popLast() { // do stuff withdog}碟贾。但是,removeLast()有removeFirst()對(duì)應(yīng)轨域,而popLast() 沒有
 let popDog = dogs.popLast()
print("打印popDog = \(popDog)")
let removeDog = dogs.removeLast()
print("打印removeDog = \(removeDog)")
- 打印刪除.png
  • 插入

// newElement: 要插入的元素  at: 要插入的位置
// dogs.insert(<#T##newElement: Element##Element#>, at: <#T##Int#>)
dogs.insert(Dog(breed: "huazai", age: 4), at: 0)
  • 數(shù)組的效率

    • Array和ContiguousArray的比較
let array2 = Array<Int>(1...1000000)
let array3 = ContiguousArray<Int>(1...1000000)
var start = CFAbsoluteTimeGetCurrent()
array2.reduce(0, +)   // 50500000
var end = CFAbsoluteTimeGetCurrent() - start
print("array Took \(end) seconds")
start = CFAbsoluteTimeGetCurrent()
array3.reduce(0, +)   // 50500000
end = CFAbsoluteTimeGetCurrent() - start
print("ContiguousArray  Took \(end) seconds")
打印時(shí)間袱耽,差不多是2倍.png



  • 三、Set集合

    • 集合的方法
    • insert()體現(xiàn)無序性
    • contains()包含關(guān)系
    • remove()移除元素
    • sorted(), map() and filter() 方法等
var set1 = Set<Int>([1, 2, 3, 4, 5]) // 5, 2, 3, 1, 4 集合的無序性和不重復(fù)性
var array1 = Array(set1) // 5, 2, 3, 1, 4
var set2 = Set(array1)   // 5, 2, 3, 1, 4
for number in set1 {
         print(number)  // 5, 2, 3, 1, 4
}
for number in set1.sorted() {
         print(number) // 1, 2, 3, 4, 5
}

奇怪的是Set有popFirst(),沒有popLast()干发,而數(shù)組恰恰相反朱巨,我想知道Why?

  • 集合的交并補(bǔ)

let spaceships1 = Set(["Serenity", "Nostromo", "Enterprise"])
let spaceships2 = Set(["Voyager", "Serenity", "Executor"])
let union = spaceships1.union(spaceships2) // 并集
let intersection = spaceships1.intersection(spaceships2) // 交集
let difference = spaceships1.symmetricDifference(spaceships2) // 除交集以外的集合
兩個(gè)集合.png
并集.png
交集.png
除交集以外的集合.png
  • 集合的其他方法

? A.isSubsetOf(B): returns true if all of set A's items are also in set B.
? A.isSupersetOf(B): returns true if all of set B's items are also in set A.
? A.isDisjointWith(B): returns true if none of set B's items are also in set A.
? A.isStrictSubsetOf(B): returns true if all of set A's items are also in set B, but A and B are not equal
? A.isStrictSupersetOf(B): returns true if all of set B's items are also in set A, but A and Bare not equal
#### 翻譯:####
?A.isSubset(of: B):返回true,A是B的子集枉长,A和B是可以是一樣的冀续。
?A.isSuperset(of: B):返回true,A是B的父集, A和B是可以是一樣的。
?A.isDisjoint(with:B):返回true,A子集的任何一個(gè)元素都不包含在B集合中必峰。
?A.isStrictSubsetOf(B):返回true,A是B的子集,但A和B是不一樣的洪唐,兩者不能等價(jià)
?A.isStrictSupersetOf(B):返回true,如果A的所元素也在設(shè)置在B中,并且A元素中的個(gè)數(shù)小于B中元素的個(gè)數(shù),也就是A和B是不一樣的吼蚁,兩者不能等價(jià)
  • eg:舉個(gè)1

var spaceships1 = Set(["Serensdaity", "Nostromo", "Enterprise"])
let spaceships2 = Set(["Voyager", "Serenity", "Executor"])
let spaceships = Set(["Voyager", "Serenity"])
spaceships.isSubset(of: spaceships2)        // true
spaceships.isSuperset(of: spaceships2)      // false
spaceships1.isDisjoint(with: spaceships2)   // trues
paceships.isStrictSubset(of: spaceships2)   // true
spaceships.isSuperset(of: spaceships2)      // false
結(jié)果圖.png
  • eg:舉個(gè)2

let spaceships1 = Set(["Serenity", "Nostromo", "Enterprise"])
let spaceships2 = Set(["Voyager", "Serenity", "Star Destroyer"])
let spaceships3 = Set(["Galactica", "Sulaco", "Minbari"])
let spaceships1and2 = spaceships1.union(spaceships2)
spaceships1.isSubsetOf(spaceships1and2)         // true
spaceships1.isSubsetOf(spaceships1)             // true
spaceships1.isSubsetOf(spaceships2)             // false
spaceships1.isStrictSubsetOf(spaceships1and2)   // true
spaceships1.isStrictSubsetOf(spaceships1)       // false
spaceships1and2.isSupersetOf(spaceships2)       // true
spaceships1and2.isSupersetOf(spaceships3)       // false
spaceships1and2.isStrictSupersetOf(spaceships1) // true
spaceships1.isDisjointWith(spaceships2)         // false
  • 集合的相加以及獲取集合中元素的個(gè)數(shù)

var spaceships = ["Serenity", "Nostromo", "Enterprise"]
spaceships += ["Voyager", "Serenity", "Star Destroyer"]
spaceships += ["Galactica", "Sulaco", "Minbari"]
let countedSet = NSCountedSet(array: spaceships)
print(countedSet.count(for: "Serenity")) // 2,雖然不會(huì)重復(fù)出現(xiàn)桐罕,但是他可以統(tǒng)計(jì)到出現(xiàn)了幾次
print(countedSet.count(for: "Sulaco"))   // 1
打印截圖.png

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市桂敛,隨后出現(xiàn)的幾起案子功炮,更是在濱河造成了極大的恐慌,老刑警劉巖术唬,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件薪伏,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡粗仓,警方通過查閱死者的電腦和手機(jī)嫁怀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門设捐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人塘淑,你說我怎么就攤上這事萝招。” “怎么了存捺?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵槐沼,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我捌治,道長(zhǎng)岗钩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任肖油,我火速辦了婚禮兼吓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘森枪。我一直安慰自己视搏,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布县袱。 她就那樣靜靜地躺著浑娜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪显拳。 梳的紋絲不亂的頭發(fā)上棚愤,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音杂数,去河邊找鬼宛畦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛揍移,可吹牛的內(nèi)容都是我干的次和。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼那伐,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼踏施!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起罕邀,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤畅形,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后诉探,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體日熬,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年肾胯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了竖席。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耘纱。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖毕荐,靈堂內(nèi)的尸體忽然破棺而出束析,到底是詐尸還是另有隱情,我是刑警寧澤憎亚,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布员寇,位于F島的核電站,受9級(jí)特大地震影響虽填,放射性物質(zhì)發(fā)生泄漏丁恭。R本人自食惡果不足惜曹动,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一斋日、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧墓陈,春花似錦恶守、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至仔拟,卻和暖如春衫樊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背利花。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工科侈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人炒事。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓臀栈,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親挠乳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子权薯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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