计算型属性和存储型属性的区别
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方法,通常做法是使用一个存储属性来辅助进行计算
存储属性和计算属性比较
- 1 .计算属性可以用于类、结构体和枚举,存储属性只能用于类和结构体
- 2.计算属性只能用关键字
var
定义,存储属性var
和let
都可以 - 3.计算属性不直接存储值,而是提供一个
getter
和一个可选的setter
,来间接获取和设置其他属性或变量的值(这里和Objective-C
区别蛮大的,Objective-C
属性会有对应的setter
、getter
方法、对应的实例变量)
面试题:如下代码有什么问题?
var name: String {
get{
return name
}
set{
name = newValue
}
}
这样子写编译器会警告,但是可以通过编译,不会报错,实际上仔细看报错就知道这是个死循环
方法转计算属性
计算字符串中有多少个数字
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
}
}
从示例中可以看出,方法可以转成计算属性,同样可以将计算属性转化成方法.实际开发中一般方法使用比较多些,如果考虑这个方法比较常用,并且不需要传参数,那么可以考虑将方法转成计算属性,方便使用