计算型属性和存储型属性的区别

1.存储型属性:用于存储一个常量或者变量

class Person {
    var name: String = "船长"
    let age: Int = 10

    lazy var p1:Person = Person()
}

1-1.通过闭包运算赋值的存储属性

// 存储属性
var arr:[Int] =  {
    return [1,2,3];
}()

// 实际开发中,经常简写
var arr:[Int] = [1,2,3]()

这种闭包,猛地一看有点像计算属性,实际上区别还是蛮大的, 运算符=, 大括号后的()

简单的来说,存储属性就是用来保存值,工作中非常的常用,比如保存外界传过来的block,保存一个对象,使全局都可以使用

2.计算型属性: 计算性属性不直接存储值,而是用 get/set来取值和赋值,可以操作其他属性的变化

class Person {

    var _weight: Int = 10
    // 可读可写的计算属性
    var weight: Int {

        get {
            return _weight * 3
        }
        set(newValue) { 
            _weight = newValue * 5
        }
    }
    // 只读计算属性:只有get方法
    var size: Int{
        get {
            return _weight * 3
        }
    }
    // get可以省略,简写如下
    var size: Int{
       return _weight * 3
    }
}

在Swift中,写一个计算属性的set和get方法,通常做法是使用一个存储属性来辅助进行计算

存储属性和计算属性比较

面试题:如下代码有什么问题?

var name: String {
    get{
        return name
    }
    set{
        name = newValue
    }
}

demo

这样子写编译器会警告,但是可以通过编译,不会报错,实际上仔细看报错就知道这是个死循环

方法转计算属性

计算字符串中有多少个数字

var str = "123test123"

extension String {
    func numberCount() -> Int {
        var count = 0
        for c in self where ("0"..."9").contains(c) {
            count += 1
        }
        return count
    }
    
    /*↓↓↓↓↓↓ 方法转计算属性 ↓↓↓↓↓↓*/
    var numberCount: Int {
    var count = 0
        for c in self where ("0"..."9").contains(c) {
            count += 1
        }
        return count
    }
}

从示例中可以看出,方法可以转成计算属性,同样可以将计算属性转化成方法.实际开发中一般方法使用比较多些,如果考虑这个方法比较常用,并且不需要传参数,那么可以考虑将方法转成计算属性,方便使用