以下關(guān)鍵字關(guān)于引用傳參、屬性、修改成員變量、靜態(tài)變量、索引和構(gòu)造函數(shù)重載
讀過The Swift PRogramming Language的人都能看得出,我上面的這幾個說法全不是apple的習(xí)慣用語。之所以這么起題目是因為很多最近轉(zhuǎn)到swift下,但原本又不是搞ios開發(fā)的人,并不習(xí)慣apple的說法。他們經(jīng)常在查詢他人博客的時候因為某些名詞的表示方式不同,而把原本簡單的問題搞得一頭霧水。就像我在剛接觸oc的時候,很奇怪message和protocol的說法一樣,因為我的mother programming language可以說是C#,我更接受parameter和interface的說法。
下面讓我們用幾個簡單的keyWord來解釋一下swift中這幾個可能會讓你想幾分鐘,但本身又很簡單的語法。
一、 in-out
這里in-out作為函數(shù)聲明時,引用傳值的關(guān)鍵字。相當(dāng)于C#和java中得ref和out。但是在函數(shù)調(diào)用的時候要寫一個“&”符號在參數(shù)前面。
如下列代碼:
func swapTwoInts(inout a: Int, inout b: Int) { let temporaryA = a a = b b = temporaryA}var someInt = 3var anotherInt = 107swapTwoInts(&someInt, &anotherInt)println("someInt is now /(someInt), and anotherInt is now /(anotherInt)")
這是The Swift Programming Language中的實(shí)例,交換兩個數(shù)的值。
二、 get set and willSet didSet
對于C#熟悉的人可以一眼看出get set是什么意思,就如下面代碼所示,這種寫法可以簡化我們的工作:
struct AlternativeRect { var origin = Point() var size = Size() var center: Point { get { let centerX = origin.x + (size.width / 2) let centerY = origin.y + (size.height / 2) return Point(x: centerX, y: centerY) } set { origin.x = newValue.x - (size.width / 2) origin.y = newValue.y - (size.height / 2) } }}
對于更簡單而言我們還有@lazy的寫法,用于屬性在初始化之后才被賦值的情況。
class Head{
var eyes = "eyes"
var nose = "Nose"
}
class Arm{
var hands = "hands"
}
class Human{
@lazy var head = Head()
@lazy var arm = Arm()
}
var human = Human()
var newhead = Head()
newhead.eyes = "blueeyes"
human.head = newhead
如果是protocol中聲明一個屬性,可以:
protocol SomeProtocol { var mustBeSettable: Int { get set } var doesNotNeedToBeSettable: Int { get }}
其實(shí)這也比較像C#,以前的oc是不支持protocol中有屬性的,僅僅是個方法列表。
willSet和didSet是兩個非常好玩的東西??梢詫傩再x值前和賦值后進(jìn)行一定的操作:
class StepCounter { var totalSteps: Int = 0 { willSet(newTotalSteps) { println("About to set totalSteps to /(newTotalSteps)") } didSet { if totalSteps > oldValue { println("Added /(totalSteps - oldValue) steps") } } }}let stepCounter = StepCounter()stepCounter.totalSteps = 200// About to set totalSteps to 200// Added 200 stepsstepCounter.totalSteps = 360// About to set totalSteps to 360// Added 160 stepsstepCounter.totalSteps = 896// About to set totalSteps to 896// Added 536 steps
這種方法對于寫一個客戶端app增加了極大的靈活性,把willSet和didSet封裝到class中有助于我們更方便的控制對象的屬性。
三、 mutating
這個關(guān)鍵字至少我是第一次見,他的作用是寫在func前面,以便讓func可以修改struct和protocol的extension中的成員的值。如果不加此關(guān)鍵字,成員值便被保護(hù)起來,不得修改。
例如:
struct Point { var x = 0.0, y = 0.0 mutating func moveByX(deltaX: Double, y deltaY: Double) { x += deltaX y += deltaY }}var somePoint = Point(x: 1.0, y: 1.0)somePoint.moveByX(2.0, y: 3.0)println("The point is now at (/(somePoint.x), /(somePoint.y))")
這讓成員事實(shí)上面的更加的安全,因為在swift中沒有private的概念。
四、 class var
在swift中對于enum和struct來說支持用static關(guān)鍵字來標(biāo)示靜態(tài)變量,但是對于class成員來說,只能以class var的方式返回一個只讀值。如下:
struct SomeStructure { static var storedTypeProperty = "Some value." static var computedTypeProperty: Int { // return an Int value here }}enum SomeEnumeration { static var storedTypeProperty = "Some value." static var computedTypeProperty: Int { // return an Int value here }}class SomeClass { class var computedTypeProperty: Int { // return an Int value here }}
這樣其實(shí)很好的區(qū)分了struct和class的功能,不像C#抓來一個隨便用,但相對于oc來講其實(shí)是弱化了界限,如果你想在class中搞一個非只讀的靜態(tài)變量出來,可以和struct進(jìn)行配合。
若想實(shí)現(xiàn)安全線程的單例模式,可以采用和struct結(jié)合的方式:
來源:http://blog.csdn.net/u010124617/article/details/28856711
class SwiftSingleton{ class func shareInstance()->SwiftSingleton{ struct YRSingleton{ static var predicate:dispatch_once_t = 0 static var instance:SwiftSingleton? = nil } dispatch_once(&YRSingleton.predicate,{ YRSingleton.instance=SwiftSingleton() } ) return YRSingleton.instance! }}
五、 subscript syntax
所謂subscript就是用[]來進(jìn)行索引,這種語法十分靈活,可能借鑒了一些Python的風(fēng)格。
如struct、array、dictionary都可以通過subscript進(jìn)行索引:
struct Duden { let offset:Int var textCount:Int subscript(index:Int) -> Int{ get{ return index - offset } set(newvalue){ textCount = newvalue * 3 } }}var duden = Duden(offset:2,textCount:0)duden[9] //7
duden[9] = 8 //duden.textCount 24
六、 convenience
convenience用來進(jìn)行方便的初始化,說白了就相當(dāng)于構(gòu)造函數(shù)重載,對于class來講,默認(rèn)或指定的初始化方法作為所謂的Designated初始化,若重載的初始化需要調(diào)用Designated初始化則將它作為convenience初始化,在方法前要加上convenience關(guān)鍵字。
class Figure{ var name:String! var nikname:String? init(){ name = "John" } convenience init(name:String!,nikname:String!){ self.init() self.name = name self.nikname = nikname }}
這個在涉及到繼承的時候還有很多擴(kuò)展,這里就不一一列舉了。
http://www.wenjuan.com/s/77N7Jj
總之,這些新的關(guān)鍵字和新的特性都讓這門新的語言變得靈活和安全。雖然初期會給你帶了很多困惑和不便,但是你會很快愛上這門語言的。
歡迎訪問傾劍飛血的博客:http://www.companysz.com/jacklandrin/p/3782831.html
新聞熱點(diǎn)
疑難解答