Swift-代码风格

69 阅读1分钟

0、Swift类内 一般不需要写self.,但是闭包内是需要写的

1、AnyAnyObject类型, 赋值时一定要用 as!as?做类型匹配

func dosomething(flag: Any){
    if let b = flag as? String, b == "b" {
	debugPrint("ok")
    }
}

2、申明函数参数 或返回值时加,否则传参数 或返回返回值的时候,对于可选类型的值要加!

3、判空

if let a = b {
    // do...
}

guard let monkey = monkey else {
    print("monkey is nil")
}

guard index >= 0 && index < doughnuts.count else {
    // 越界情况需要提早结束
    return
}
let doughnut = doughnuts[index]


let ages: [Int?] = [nil,2,3,nil]
for case let age? in ages{
    print(age)
}
等价于
let ages: [Int?] = [nil,2,3,nil]
for item in ages{
    if let age = item {
        print(age)
    }
}

4、面向协议编程

简单理解就是 用定义协议,来代替面向对象编程中的继承多继承等,还能达到使用灵活和解偶的目的。

让类遵守某个协议,就可以达到继承的效果,如果有多个协议,通过遵守多个协议来达到面向对象编程中的 多继承的效果

5、Swift高阶函数

map, filter, reduce,flatMap函数用的是一种函数式编程的思想

map 对操作前的数组中每个元素进行相同操作,返回的是一个结果数组(集合)

filter操作是符合筛选条件的元素,返回结果是一个数组(集合)

let evenNumbers = [4, 8, 15, 16, 23, 42].filter { $0 % 2 == 0 }
// [4, 8, 16, 42]  过滤出 偶数元素

reduce操作返回结果是一个值,该值是用初始值和数组(集合)中的每个元素调用相同操作来生成的

flatMap将多个数组(集合中)的元素放到一个数组中形成的新数组并返回

let strings = [1, 2, 3].flatMap { String($0) }
// ["1", "2", "3"]  对元素进行转 字符串 操作

6、元组(Tuple)

// 定义
var tuple1 = (100, "哈哈哈", 222)
var tuple2 = (code: 1000, msg: "请求失败")
// 取值
let a = tuple1.0   // 100
let b = tuple2.msg

元组一旦声明,就不能再增/删元素,不能更改元素名称,但可以改变元素的值。

7、混编如果想让swift类中的属性或方法 能被oc访问,就需要在属性或方法的前面加 @objc 关键字

8、判断类型

if obj1.isKind(of: ClassA.self) {

}

if obj2.isMember(of: ClassA.self) {

}

if (obj is ClassA) {
    print("属于 ClassA")
}

9、参数默认值

func dosomething (a: String = "1", b: Int){

}

10、区间运算

闭区间

a...b 等价于(>= a && <= ba..<b 等价于(>= a && < blet range = 2...8
range.contains(2) // true
range.contains(9) // false

单侧区间 当起配合数组使用的时候,会默认在数组的界限内

[a...] 表示 >= a的一些列值

// 区间运算
var arr = [1, 2, 3, 4, 5, 6, 7]
for i in arr[2...] {
    print(i)
}
// 打印结果为 3 4 5 6 7

for i in 2...5 {
    print(i)
}

11、枚举

enum PlayerState: Int {
    case none = 0
    case playing
}

12、只读属性、计算属性

var computedProperty: String {
    if someBool {
        return "xxx"
    }
    return "mmm"
}
var computedProperty: String  {
    get {
        if someBool {
            return "I'm a mighty pirate!"
        }
        return storedProperty
    }
    set {
        storedProperty = newValue
    }
}