MG--Swift3.x进阶语法学习2

  • 最喜欢Swift的类型转换和过滤数组():

    • 为什么呢?看了下面的例子你就明白了,看Swift和Objective-C的对比
  • 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]];            
        }]
];



  • 一、数组

  • 1.数组的初始化

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


    String的count:repeatedValue:初始化一个字符串
    初始化一个一维数组和二维数组
  • 2.进制转换>

  • 十进制的转化

String(12, radix: 16)   // 十进制转16进制
String(12, radix: 8)   // 十进制转8进制
String(12, radix: 2)   // 十进制转2进制
String(12, radix: 4)   // 十进制转4进制
进制转换结果
  • 其他进制的转化

// 数字转化后的字母是否需要大小写 
 // str设置为“1 c”。如果你喜欢——即“1 C”。,大写
String(28, radix: 16, uppercase: true)  // 打印结果:"1C"
String(18, radix: 16, uppercase: true)  // 打印结果:"12"
// 字符串转化  (转换回一个整数——记住,可选!)
let int = Int("1C", radix: 16)          // 打印结果:28
其他进制的转化

  • 3.数组和集合的转化

let scores = [5, 3, 6, 1, 3, 5, 3, 9, 6] // 数组
let scoresSet = Set(scores)              // 集合,从打印结果看出不会重复,且集合是无序的
let uniqueScores = Array(scoresSet)      // 从集合中创建一个数组
数组和集合的转化

  • 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
}
  • 具体使用场景:

  • 创建一个结构体,有名字和color。它会自动生成构造方法

struct Boy {
        let name: String
        let color: Color
}
  - 如何使用:我们不需要使用UIColor. Pink,可以直接.Pink
let 明哥 = Boy(name: "明哥", color: . Green)
let 路西 = Boy(name: "My Girl Friend", color: . Purple)
它会自动生成构造方法
举个
  • 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   // 这样会报错,需改为Color.Pink. hasValue
  // 改为Color.Pink. hasValue == 打印出来的是3 // 从结果可以看出,也就是说默认会从0开头算起
改为Color.Pink. hasValue == 打印出来的是3
  • 枚举:指定是String类型

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



  • 二、数组排序

    • 默认排序:升序

 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() //排序 
打印结果
  • 升序和降序的可掌控

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)
数组排序
  • 操作符重载

  • 控制器外边方法

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)")
    }
打印结果
  • 数组的增加、删除和插入

  • + 增加 数组与数组的增加

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] // 拼接一个数组等价于dogs.append(contentsOf: [beethoven])
dogs.append(Dog(breed: "xiaohua", age: 3)) // 拼接一个元素
  • - 删除 主要讲解删除最后一个元素

    • removeLast() 和popLast()两者都是删除最后一个元素并返回删除的对象。唯一的区别看下图打印可知,popLast()删除返回的对象是可选值。如果数组中有空值(nil)的时候,使用removeLast(),程序就会崩溃。所以如果你的数组中有可能是空值,当你尝试删除一个条目,使用popLast(),您可以安全地检查返回值:if let dog = dogs.popLast() { // do stuff withdog}。但是,removeLast()有removeFirst()对应,而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)
  • 数组的效率

    • 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")
打印时间,差不多是2倍.png



  • 三、Set集合

    • 集合的方法
    • insert()体现无序性
    • contains()包含关系
    • remove()移除元素
    • sorted(), map() and filter() 方法等
var set1 = Set<Int>([1, 2, 3, 4, 5]) // 5, 2, 3, 1, 4 集合的无序性和不重复性
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(),而数组恰恰相反,我想知道Why?

  • 集合的交并补

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) // 除交集以外的集合
两个集合.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子集的任何一个元素都不包含在B集合中。
•A.isStrictSubsetOf(B):返回true,A是B的子集,但A和B是不一样的,两者不能等价
•A.isStrictSupersetOf(B):返回true,如果A的所元素也在设置在B中,并且A元素中的个数小于B中元素的个数,也就是A和B是不一样的,两者不能等价
  • eg:举个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
结果图.png
  • eg:举个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
  • 集合的相加以及获取集合中元素的个数

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,虽然不会重复出现,但是他可以统计到出现了几次
print(countedSet.count(for: "Sulaco"))   // 1
打印截图.png

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容