Swift :)willSet 和 didSet

作者: Misaki_yuyi | 来源:发表于2017-02-21 15:50 被阅读995次

公司做的项目,经过半年的迭代,越来越稳定,一直没有时间也没有精力,静下心了学习Swift。之前很迷茫,不知道是学Swift,还是学前端。考虑到是学iOS出身,还是先学好Swift,在去学习其他的把。

新建项目,导入三方库,暂时用得到的只有这么多:

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, ‘8.0’
use_frameworks!

target ‘PandaSwift’ do
 pod 'Alamofire', '~> 4.2.0'
 pod 'HandyJSON', '~> 1.3.0'
 pod 'SnapKit', '~> 3.0.2'
 pod 'SwiftyJSON', '~> 3.1.3'
 pod 'PKHUD', '~> 4.0'
 pod 'Kingfisher', '~> 3.4.0'
end

想着拿公司的项目,做个Swift版本来先练练手。首先是登录注册页面,获取验证码的逻辑和OC 不太一样,OC的做法是在调取验证码接口,利用GCD或者定时器来完成,根据描述来判断按钮的状态,代码入下

__block int timeout = 59; 
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);
    dispatch_source_set_timer(_timer,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0); //每秒执行
    dispatch_source_set_event_handler(_timer, ^{
        if(timeout<=0)
        { //倒计时结束,关闭
            dispatch_source_cancel(_timer);
            dispatch_async(dispatch_get_main_queue(), ^{
                [codeBtn setTitle:@"发送验证码" forState:UIControlStateNormal];
                [codeBtn setBackgroundImage:[UIImage imageNamed:@"codebtn"] forState:UIControlStateNormal];
                codeBtn.userInteractionEnabled = YES;
            });
        }
        else
        {
            NSString * titleStr = [NSString stringWithFormat:@"剩余%d秒",timeout];
            [codeBtn setBackgroundImage:[UIImage imageNamed:@"codebtn_no"] forState:UIControlStateNormal];
            dispatch_async(dispatch_get_main_queue(), ^{
                [codeBtn setTitle:titleStr forState:UIControlStateNormal];
                codeBtn.userInteractionEnabled = NO;
            });
            timeout--;
        }
    });
    dispatch_resume(_timer);

Swift版本就用willSet 和 didSet 来实现按钮的状态切换。

var countdownTimer: Timer?
    
    var remainingSeconds:Int = 0 {
        willSet{
            codeBtn.setTitle("剩余\(newValue)s", for: .normal)
            
            if newValue <= 0
            {
                codeBtn.setTitle("获取验证码", for: .normal)
                isCounting = false
            }
        }
    }
    
    var isCounting = false{
        willSet{
            if newValue{
                countdownTimer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: { (timer) in
                    self.remainingSeconds -= 1
                })
                
                remainingSeconds = 9
                codeBtn.backgroundColor = UIColor.gray
            }else{
                countdownTimer?.invalidate()
                countdownTimer = nil
                codeBtn.backgroundColor = UIColor.red
            }
            
            codeBtn.isEnabled = !newValue
        }
    }

然后在Btn的点击事件设置 把isCounting置为ture。
willSet是在设置新值之前调用,willSet观察器会将新的值作为参数传入,默认参数名为newValue。didSet是设置新值后立即调用,观察期会将旧的值作为参数传入,默认参数为oldValue。
需要注意的是在属性初始化的时候不会调用willSet 和 didSet方法。如果在didSet 为属性赋值,这个值会替换原来观察器之前设置的值。

相关文章

网友评论

  • APP叫我取个帅气的昵称:兄弟,我怎么感觉你和我的经历想法都一样呢:joy:,公司项目OC 迭代至今8个月,自己用swift 重写项目完成了1/3。当初也在纠结学前端还是swift ,出于和你一样的想法先学了swift ,就连这个获取验证码倒计时今天刚敲到:joy:。不过明天开始搞小程序了
    APP叫我取个帅气的昵称:@Misaki_yuyi 加油
    Misaki_yuyi:@APP叫我取个帅气的昵称 项目迭代快一年了 基本上每两周一版 公司就我一个iOS 项目老大带着前端在搞Ionic2 老大问过我的想法 是想继续学习Swift 还是慢慢转前端 我表示还是想在iOS再深入一些 老大说都可以看个人喜好 我自己也不能闲着 之前零零散散的学习Swift 但是都没有记录下来 这次刚完成开发任务 就记下来

本文标题:Swift :)willSet 和 didSet

本文链接:https://www.haomeiwen.com/subject/kfjuwttx.html