基础语法速查 http://www.jianshu.com/p/1c25105bba4f
import Foundation
class Person : NSObject {
//普通属性
var firstName = ""
var lastName = ""
var nickName = ""
// 只读的属性,相当于readOnly
// private(set) var name: String
//计算属性,不需要等号,不需要初始值,swift要求存储属性在对象构造完毕后必须有初始值,计算属性没有要求
var fullName:String{
set{
//如果没有set,就是只读属性
print(newValue)
}
get{
return nickName + " " + firstName + " " + lastName
}
}
//带属性监视器的普通属性,直接大括号,然后 didSet 就相当于oc的重写set方法
var age = 0{
//我们需要在age属性变化前做点什么
willSet{
print("Will set an new value \(newValue) to age ")
}
// 我们需要在age属性发生变化后,更新一下nickName这个属性
// didset里可以做以前oc在重写set时做的事
didSet{
print("age filed changed form \(oldValue) to -> \(age)")
if age<10{
nickName = "Little"
}else{
nickName = "Big"
}
}
}
比如经常重写的setModel
- (void)setModel{
_model = model
self.leftLabel.text = model.title
self.button.setTitle(model.title, forState: .Normal)
self.rightLabel.text = model.desc
}
var model : MyModel!{
didSet{
self.left.text = model.left
self.button .setTitle(model.button, forState: .Normal)
self.right.text = model.right
}
}
// 懒加载, 后面的类型 :[Int] 不可以省略, 在{}后有个()
lazy var dataArray : [Int] = {
var array = [Int]()
for i in 0 ..< 100{
array.append(i)
}
print(self)
return array
}()
let block = {
print("我是一个闭包,")
}
lazy var lazyBlock = {
print("我是一个懒加载的闭包")
}
override var description: String {
return "Full Name: \(fullName) " + ", Age: \(age)"
}
deinit{
print("person 死了")
}
}
外界调用 :
var me : Person! = Person()
me.firstName = "Zhang"
me.lastName = "San"
me.age = 20
me.block()
me.lazyBlock()
me.lazyBlock = { print("我是新产生的懒加载闭包,因为懒加载必须是var类型") }
me.lazyBlock()
print(me)
me = nil
/*程序输出
Will set an new value 20 to age
age filed changed form 0 to -> 20
我是一个闭包,
我是一个懒加载的闭包
我是新产生的懒加载闭包,因为懒加载必须是var类型
Full Name: Big Zhang San , Age: 20
person 死了
*/
总结:
1. 计算属性不需要=,因为不需要初始化,其他属性都需要=
2. 普通属性和带观察器的属性不需要类型,这两个可以根据类型推断得出,计算属性,lazy属性需要类型,在初始化结束时,这两个都是没有值的,所以需要带类型
3. lazy属性需要(),可能是为了和闭包有个区分吧,lazy属性 必须是var
补充一下常用的UIColor类别
extension UIColor {
// 这样调用
// UIColor.init(hex: 0x3234FF)
// UIColor(hex: 0x1245ab, alpha: 0.5)
convenience init(hex : UInt32 , alpha: CGFloat = 1.0) {
let b: UInt32 = hex%256
let g: UInt32 = (hex>>8)%256
let r: UInt32 = (hex>>16)%256
print(r.description + "\t" + g.description + "\t" + b.description)
self.init(red: CGFloat(r)/255.0, green: CGFloat(g)/255.0, blue: CGFloat(b)/255.0, alpha: alpha)
}
}
在加一个单例的写法
//声明一个单例
class SingleClass: NSObject {
static let defaultManager = SingleClass.init()
var money = 13.5
}
let manager1 = SingleClass.defaultManager
print(manager1.money)
let manager2 = SingleClass.defaultManager
manager2.money = 3523
print(manager1.money)
/*
13.5
3523.0
*/