胡东东博客

从一个报错说下Swift计算属性和存储属性


All paths through this function will call itself

OC的属性访问

在OC中,如果在设置某个属性,同时还有其他操作时,可以直接调用set方法,例如

@property (nonatomic, copy) NSString *mName;
@property (nonatomic, assign) BOOL mCloseWhenClickBG;

//设置属性
- (void)setMCloseWhenClickBG:(BOOL)mCloseWhenClickBG {
    _mCloseWhenClickBG = mCloseWhenClickBG;
    if (mCloseWhenClickBG) {
        ///设置为true的逻辑
        self.mName = @"Hu";
    } else {
        ///设置为false的逻辑
        self.mName = @"Dong";
    }
}

这样在修改该属性的时候,会触发对应的逻辑,_mCloseWhenClickBG作为实际备份数据,在调用self.mCloseWhenClickBG时,返回的是之前就设置过的_mCloseWhenClickBG值。

swift的属性:存储属性和计算属性

Swift中的属性没有对应的实例变量,属性的备份存储也无法直接访问,swift不能通过_mCloseWhenClickBG直接访问属性对象。

swift的属性可以分为存储属性计算属性

存储属性

存储属性就是类似于上面oc的例子

class HDBaseVC: UIViewController {
    var mName = ""
    var mCloseWhenClickBG : Bool = true
}

访问的时候,可以使用self.mCloseWhenClickBG去访问,但是他没有set方法,如果想在修改的这个值的时候,做其他操作怎么办呢?swift提供了属性观察者

那这个地方就可以写成

class HDBaseVC: UIView {
    var mCloseWhenClickBG : Bool = true {
        willSet {
            if newValue {
                //为true的操作
                self.mName = "Hu";
            } else {
                //为false的操作
                self.mName = "Dong";
            }
        }
        didSet {
            
        }
    }
}

这个直接写后面的操作即可,不需要再想OC一样设置一个_mCloseWhenClickBG的值是什么。

计算属性

swift还提供了计算属性,顾名思义就是这个属性是根据其他存储属性去计算获得值。它自己不直接存储值,都是间接获取和设置其他属性或变量的值

例如上面的例子,如果修改为计算属性,那么就是

class HDBaseVC: UIView {
    var mName = ""
    var mCloseWhenClickBG : Bool {
        set {
            if newValue {
                //为true的操作
                self.mName = "Hu";
            } else {
                //为false的操作
                self.mName = "Dong";
            }
        }
        get {
            if self.mName == "Hu" {
                    return true
            } else {
                    return false
            }
        }
    }
}

区别就是计算属性的设置和获取全都是根据别的数据获取的,自己是没有数据的,所以不要写成了

下面这个是计算属性的错误示例

class HDBaseVC: UIView {
    var mName = ""
    var mCloseWhenClickBG : Bool {
        set {
            self.mCloseWhenClickBG = newValue
        }
        get {
            return self.mCloseWhenClickBG
        }
    }
}

写OC写习惯了,swift需要注意的地方还是需要记录下

当前页面是本站的「Baidu MIP」版。查看和发表评论请点击:完整版 »