---恢復內容開始---
相信研究swift語言的開發者都多多少少了解或者精通Objective—C語言,熟練掌握Objective—C語言的開發者,在學習swift語言的過程中,是比較快速,而又輕松的。本人就是一位熟練掌握OC語言,后開始研究的swift。在學習swift語言的過程中,筆者建議有OC基礎的開發者,在寫swift的代碼過程中,再寫一下OC中的代碼,二者相互比較,相信你能找到快速學會swift語言的方法。資深,有耐心和有天賦的開發者,相信能在一周左右,能夠運用swift開發項目。其中消耗的時間,也只是個別地方的學習,了解並注意。
我這次寫的是swift中的監聽即KVO的用法,一開始我是先寫成OC的代碼,然后轉化成swift的代碼的。在轉化過程中發現一些問題,費了一定時間去研究,去思考,去找資料。一下是swift中KVO中所需要注意的問題(僅個人測試所總結的,代碼有不對之處望指正,期望共同交流)。
1,在寫swift的KVO的過程中,其不能監聽基本數據類型的屬性,若想監聽需將其改成NSNumber類型,或其它類型,否則監聽的代理方法不走。
2,在寫swift的KVO的過程中,被監聽的屬性必須用“dynamic”修飾,否則監聽的代理方法不走。
3,在寫swift的KVO的過程中,要保證監聽者和被監聽者同時存在(考慮到其生命周期)。
4,在寫swift的KVO的過程中,要確保最后移除觀察者,防止內存泄露。
以下是代碼部分
ViewController.swift頁面
//
// ViewController.swift
// swift監聽的用法
//
// Created by mac on 16/2/6.
// Copyright © 2016年 ZY. All rights reserved.
//
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var btn: UIButton!
var _view1:NewView!;
var myObject:MyNSObject!;
var age:Int!;
//myContext的作用,主要是區分監聽對象,具體作用,科自己上網查閱資料
private var myContext = 0
override func viewDidLoad() {
super.viewDidLoad()
btn.addTarget(self, action: "buttonAction:", forControlEvents: UIControlEvents.TouchUpInside);
_view1 = NewView(frame: CGRectMake(100,50,100,100));
_view1.backgroundColor = UIColor.orangeColor();
self.view.addSubview(_view1);
myObject = MyNSObject();
_view1.addObserver(self, forKeyPath: "age", options: NSKeyValueObservingOptions.New, context: &myContext);
// self.myObject.data = NSDate();
self._view1.data = NSDate();
age = 10;
}
func buttonAction(btn : UIButton){
age = age + 10;
let num = NSNumber(integerLiteral: age);
self._view1.age = num;
}
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
}
override func viewDidDisappear(animated: Bool) {
super.viewDidDisappear(animated);
//移除監聽
self.removeObserver(self, forKeyPath: "age", context: &myContext);
}
}
NewView.swift頁面
//
// NewView.swift
// swift監聽的用法
//
// Created by mac on 16/2/6.
// Copyright © 2016年 ZY. All rights reserved.
//
import UIKit
class NewView: UIView {
// 懶加載
// lazy var label:UILabel = {
// let label = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 40))
// return label
// }()
//注解,,,使用監聽的時候,基本數據類型,不能作為監聽的屬性對象,且前面必須用dynamic修飾
dynamic var age : NSNumber!;
dynamic var data = NSDate();
override init(frame: CGRect) {
super.init(frame: frame);
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
移除監聽,在使用中沒有
dealloc方法,可以使用deinit方法替代
Swift技術交流群,512847147,同時Swift學習專題,與群同步,歡迎大家加入。貝爾特倫
---恢復內容結束---
