虚位以待(AD)
虚位以待(AD)
首页 > 软件编程 > Swift编程 > 关于swift的个人小结

关于swift的个人小结
类别:Swift编程   作者:码皇   来源:互联网   点击:

本文是个人对于目前学习swift的一些心得的汇总,这里分享给大家,希望大家能够喜欢

写在前面

接触swift也有段时间了,通过这段时间自己接触和借鉴别人的经验,记录几点关于swift的小技巧,虽然不是什么高深的原理知识,但是在平常的项目中用到或许可以提高开发效率呢

🙃,哈哈,接下来就简单总结一下:

枚举(ENUM)

结合一个小场景, 比如我们要做一个关于性别判断的一个小case:
可能我们首先想到的就是这样,硬编码写入,每次都需要手动输入

    var gender = ""gender = "man"switch gender {
    case "man": print("man") case "female": print("female")default: print("other")}

但是如果我们利用枚举来写的话:

    enum Gender {
    case man case female case other}
    var gType: Gender = .manswitch gType {
    case .man: print("男性")case .female: print("女性")case .other: print("其他类型")default: print("我也不知道")}

把需要的类型写到enum 中,就会减少不小心输入错误的几率,而且不在enum范围中的实例,编辑器也会指出。

空合运算符

比如我们要定义某个label的默认text, 也就是说,如果我们没有去人为设置,这个label就会用默认text显示,我们可能会这么写:

    var customText: String?var defaultText = "您好"var textToUse = ""if let text = customText {
    textToUse = text}
    else {
    textToUse = defaultText}

如果换种简单的写法就成了这样:

    var customText: String?var defaultText = "您好"var textToUse = ""var textToUse = customText ?? defaultText

?? 的意思就是如果textToUse为nil则选择defaultText 否则选择customText

函数式

比如我们获取10以内的奇数, 第一想法是,用for循环呀:

    var arr = [Int]()for i in 1...10 {
    if i % 2 == 1 {
    arr.append(i) }
    }
    print(arr)

当然了,必然可以计算出结果,如果换种思路呢,swift内置filter函数:

    var arr = (1...10).filter {
    (num) -> Bool in num % 2 == 1}
    print(arr)

闭包 函数

举个栗子,两个字符串拼接

使用函数:

    func sum(a: String, b: String) -> String {
    return a + b}
    var result = sum(a: "你好", b:"哈哈哈")

如果使用闭包的话:

    var sumStringClosure: (String, String) -> String = {
    $0 + $1}
    sumStringClosure("hello", "world")

有木有感觉easy了好多

convenience init 便利初始化

我们声明一个类,给这个类设置变量然后将其初始化

    class Animal {
    var dog: Int? var cat: Int? init(dog: Int, cat: Int) {
    self.dog = dog self.cat = dog }
    }
    var daDi = Animal(dag: 2, cat: 4)daDi.dogdaDi.cat

假如我们想在每次用到 Animal这个类的时候,我们想着给这个类中的dog和cat都设置好数量,我们就可以用convenience init来设置

    class Animal {
    var dog: Int? var cat: Int? init(dog: Int, cat: Int) {
    self.dog = dog self.cat = dog }
    convenience init() {
    self.init(dog: 10, cat: 10) }
    }
    var daDi = Animal()daDi.dogdaDi.cat

属性观察

自从swift更新到swift3之后 我们发现 变量的setget方法发生改变了有木有,添加了一个很方便的属性就是willSet和didSet,比如我们如果求一个正方形的周长,使用function的话是这样子的 :

    var length :Double?func getDiameter(length: Double) -> Double {
    return length * 4}
    getDiameter(length: 10)

如果我们使用变量的属性观察方法:

    var perimeter: Double?var length: Double? {
    willSet {
    print("准备赋值中")}
    didSet {
    perimeter = length! * 4}
    }
    length = 20perimeter

willSet
是在属性发生改变之前调用的
didSet
是在属性发生改变之后调用的。

遍历方法

打印字符串:如果使用while 来

    var i = 0while i < 5 {
    print("irembeu") i += 1}

我们必须要定义一个变量来确保打印达到我们要求的次数,但是我们定义越多的变量就意味着出错的风险越大,所以还是尽量少写点儿代码,改成for循环版:

    for _ in 1...10 {
    print("itembeu")}

不需要我们定义多余变量,因为swift语法设计的时候用_来代替可以忽略的变量了

计算属性 函数

取圆的直径和半径:
1、使用函数:在这种情况下,我们根据半径求直径,根据已经直径求半径,需要写两个function

    func getDiameter(radius: Double) -> Double {
    return radius * 2}
    func getRadius(diameter: Double) -> Double {
    return diameter / 2}
    getDiameter(radius: 20)getRadius(diameter: 100)

2、使用变量的计算属性

    var radius: Double = 10var diameter: Double {
    get {
    return radius * 2 }
    set {
    radius = newValue / 2 }
    }
    radius // 20diameter // 40diameter = 600radius // 300

我们知道直径和半径是相互依存的关系的,使用变量的计算属性这样看起来要比使用函数计算要简洁的多了。

泛型

如果我们需要将不同类型数组中的变量打印输出,我们可能会这样做:

    var stringArr = ["骑士", "湖人", "公牛"]var intArr = [1, 3, 4, 5, 6]var doubleArr = [1.0, 2.0, 3.0]func printStringArr(a: [String]) {
    for s in a {
    print(s) }
    }
    func printIntArr(a: [Int]) {
    for i in a {
    print(i) }
    }
    func printDoubleArr(a: [Double]) {
    for d in a {
    print(d) }
    }

我们需要定义不同类型的数组,如果类型多了,那我们做的无谓的工作就有点儿多了,这时候我们如果使用泛型来解决这个问题的话:

    func printElementFromArr<T>(elements: [T]) {
    for e in elements {
    print(e) }
    }
    printElementFromArr(elements: [1,2,3,4])

简单好多 有木有, 泛型是Swift语言强大的核心,泛型是对类型的抽象,使用泛型开发者可以更加灵活方便的表达代码意图。有参函数的参数必须有一个明确的参数类型,有些时候开发者会遇到这样一种情况,就像上面我们举的这个例子,由于变量有类型之分,实现相同的功能,可能需要重载成多个函数来实现,这大大浪费了开发成本,使用泛型,可以完美的解决这个问题。

拓展

swift 中没有了OC中的category 但是保留了extension, 我们和extension打交道的时候也就比较多了, 如果我们需要计算一个数的平方,我们可以声明一个函数, 像这样:

    func squ(x: Int) -> Int {
    return x * x}
    var s = squ(x: 10)

那如果我们要求10 的4次方的话,我们就要var s = squ(x: 10)
squ(x: s)创建多余变量。
使用拓展:

    extension Int {
    var squ: Int {
    return self * self }
    }
    10.squ10.squ.squ

简洁,不需要多创建变量。

Gaurd let if let

检验用户名和密码:

1、使用if let, 我们需要一层层的嵌套

    var uName: Double?var uPassword: Double?func userLogIn() {
    if let username = uName {
    if let password = uPassword {
    print("欢迎, (username)"!) }
    }
    }

2、使用gaurd let, 如果uName或者uPassword为nil的话,程序就会走return方法,提前结束运行, 否则就会print("欢迎, (username)!")

    var uName: Double?var uPassword: Double?func userLogIn() {
    guard let username = uName, let password = uPassword else {
    return }
    print("欢迎, (username)!") }

相关热词搜索: swift swift code swift 小结