麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

Swift中的一些關(guān)鍵字

2019-11-14 20:24:47
字體:
供稿:網(wǎng)友

以下關(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

 


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 黄色免费在线网站 | 免费黄色大片在线观看 | 看av网址| 欧美成a人片在线观看久 | 粉嫩蜜桃麻豆免费大片 | 又黄又爽免费无遮挡在线观看 | 黄色毛片视频在线观看 | 99re热视频这里只精品 | 九九热精品视频在线 | 久久福利电影网 | 亚洲人成免费 | 精品国产91久久久久 | av成人在线播放 | av色偷偷| 国产精品爱久久久久久久 | 欧美中文在线 | 久久国产精| 一级黄色av电影 | 在线a亚洲视频播放在线观看 | 一区二区国产在线 | 欧美成人免费看 | 亚洲综合一区在线观看 | 欧美成人一级 | 毛片大全免费看 | 九色中文字幕 | 欧美人的天堂一区二区三区 | 国产亚洲精品成人a | 国产成人网 | 日韩在线播放中文字幕 | 一级国产免费 | 日产精品一区二区三区在线观看 | 欧美一级久久 | 免费一级肉体全黄毛片 | 激情宗合网 | 羞羞答答视频 | 91精品久久久久久久久久久 | 国产色片 | 黄网站免费观看视频 | 国产精品一区二区三区在线播放 | 国产精品色综合 | 亚洲第五色综合网 |