Swift中didSet在对象初始化时调用无效及解决办法

起因

因为给user一个特定的属性,是通过expiresIn赋值给expiresDate,就要去调用一个方法

    var expiresIn:NSNumber?{    //直接在定义属性的时候写
        didSet{
            /*这个方法主要是属性被赋值的时候会被调用
            *如果是对象初始化的时候,是不会调用的,如果想被调用,要使用kvc
             */
            expiresDate = NSDate(timeIntervalSinceNow: (expiresIn?.doubleValue)!)
        }
    }

但是问题是,init的时候,不走这个方法,查阅了一下

英语不好,翻译的大概意思就是willSet和didSet如果在初始化的时候调用是无效的
但是又非常想在初始化的时候调用didSet,那么可以采用KVC的方式给对象初始化,就可以调用didSet了


使用完KVC,但是有些属性要注意,一旦属性名和字典中的key不同,一定要去特殊处理

    init(dict:[String:AnyObject]) {
        super.init()
     setValuesForKeysWithDictionary(dict)
    }
    //使用kvc,undefine方法
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {
        if (key as NSString).isEqualToString("expires_in") {
            //过期时间
            expiresIn = value as? NSNumber
        }else if (key as NSString).isEqualToString("access_token"){
            accessToken = value as? String
        }
        
    }

有了过期的nsdate,要去和当前的时间去比较使用一个compare的方法,这个方法的结果比较难记

shardUser?.expiresDate?.compare(NSDate())  ==  NSComparisonResult.OrderedDescending

结果如下:

  • OrderedDescending A>B 降序
  • OrderedAscending A
  • OrderedSame A=B

你可能感兴趣的:(Swift中didSet在对象初始化时调用无效及解决办法)