亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Swift中的一些關鍵字

2019-11-14 20:24:47
字體:
來源:轉載
供稿:網友

以下關鍵字關于引用傳參、屬性、修改成員變量、靜態變量、索引和構造函數重載

讀過The Swift PRogramming Language的人都能看得出,我上面的這幾個說法全不是apple的習慣用語。之所以這么起題目是因為很多最近轉到swift下,但原本又不是搞ios開發的人,并不習慣apple的說法。他們經常在查詢他人博客的時候因為某些名詞的表示方式不同,而把原本簡單的問題搞得一頭霧水。就像我在剛接觸oc的時候,很奇怪message和protocol的說法一樣,因為我的mother  programming language可以說是C#,我更接受parameter和interface的說法。

 

下面讓我們用幾個簡單的keyWord來解釋一下swift中這幾個可能會讓你想幾分鐘,但本身又很簡單的語法。

 

一、      in-out

這里in-out作為函數聲明時,引用傳值的關鍵字。相當于C#和java中得ref和out。但是在函數調用的時候要寫一個“&”符號在參數前面。

如下列代碼:

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中的實例,交換兩個數的值。

二、      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 }}

其實這也比較像C#,以前的oc是不支持protocol中有屬性的,僅僅是個方法列表。

willSet和didSet是兩個非常好玩的東西。可以對屬性賦值前和賦值后進行一定的操作:

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

這個關鍵字至少我是第一次見,他的作用是寫在func前面,以便讓func可以修改struct和protocol的extension中的成員的值。如果不加此關鍵字,成員值便被保護起來,不得修改。

例如:

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))")

這讓成員事實上面的更加的安全,因為在swift中沒有private的概念。

四、      class var

在swift中對于enum和struct來說支持用static關鍵字來標示靜態變量,但是對于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    }}

這樣其實很好的區分了struct和class的功能,不像C#抓來一個隨便用,但相對于oc來講其實是弱化了界限,如果你想在class中搞一個非只讀的靜態變量出來,可以和struct進行配合。

若想實現安全線程的單例模式,可以采用和struct結合的方式:

 來源: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就是用[]來進行索引,這種語法十分靈活,可能借鑒了一些Python的風格。

如struct、array、dictionary都可以通過subscript進行索引:

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用來進行方便的初始化,說白了就相當于構造函數重載,對于class來講,默認或指定的初始化方法作為所謂的Designated初始化,若重載的初始化需要調用Designated初始化則將它作為convenience初始化,在方法前要加上convenience關鍵字。

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    }}

這個在涉及到繼承的時候還有很多擴展,這里就不一一列舉了。

 

http://www.wenjuan.com/s/77N7Jj

總之,這些新的關鍵字和新的特性都讓這門新的語言變得靈活和安全。雖然初期會給你帶了很多困惑和不便,但是你會很快愛上這門語言的。

歡迎訪問傾劍飛血的博客:http://www.49028c.com/jacklandrin/p/3782831.html

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久影院资源网| 亚洲第一福利视频| 亚洲老头同性xxxxx| 日本欧美一级片| 日韩精品极品在线观看| 欧美午夜女人视频在线| 国产成人一区二区三区电影| 国产精品91视频| 国产精品美女www爽爽爽视频| 亚洲自拍偷拍一区| 成人在线国产精品| 欧美精品成人在线| 亚洲欧美变态国产另类| 中文字幕av一区二区三区谷原希美| 亚洲国产成人精品一区二区| 亚洲第一级黄色片| 欧美黄色成人网| 亚洲性av在线| 亚洲欧美日本伦理| 精品美女国产在线| 亚洲热线99精品视频| 国产精品久久久久久超碰| 国产xxx69麻豆国语对白| 毛片精品免费在线观看| 98视频在线噜噜噜国产| 国语自产精品视频在免费| www.欧美精品一二三区| 成人av电影天堂| 亚洲人成电影网站| 国产精品久久久久久久久久三级| 久久久久久成人精品| 精品久久久久久电影| 国产精品美女呻吟| 欧美人在线观看| 国产精品亚洲自拍| 狠狠躁夜夜躁人人躁婷婷91| 国产精品第一视频| 欧美在线激情网| 欧美在线免费视频| 国产精品久久久久久久久久三级| 久久综合色88| 91大神在线播放精品| 正在播放亚洲1区| 欧美日韩裸体免费视频| 亚洲va久久久噜噜噜久久天堂| 91精品免费看| 欧美精品日韩www.p站| 国产精品久久电影观看| 亚洲黄色免费三级| 精品美女国产在线| 中文字幕欧美精品在线| 日韩中文字幕视频在线观看| 日韩高清电影好看的电视剧电影| 欧美性黄网官网| 欧美韩日一区二区| 欧美xxxx做受欧美.88| 亚洲国产精品久久久久秋霞不卡| 国产精品中文在线| 成人黄色片在线| 欧美极品少妇与黑人| 亚洲va久久久噜噜噜久久天堂| 欧美成人精品不卡视频在线观看| 国产欧美日韩免费看aⅴ视频| 日韩视频免费中文字幕| 国产精品国产三级国产aⅴ9色| 精品国产美女在线| 久久中文字幕在线| 国产一区二区三区在线观看视频| 欧美性xxxxx| 亚洲免费视频在线观看| 亚洲一区二区三区香蕉| 性色av香蕉一区二区| 久久久久国产一区二区三区| 91干在线观看| 成人情趣片在线观看免费| 成人国产精品一区二区| 中文字幕九色91在线| 黑人巨大精品欧美一区免费视频| 欧美日韩国内自拍| 日韩男女性生活视频| 综合网日日天干夜夜久久| 国产成人精品电影| 91高清视频在线免费观看| 国产精品一区专区欧美日韩| 精品在线观看国产| 亚洲天堂一区二区三区| 国产成人精品电影久久久| 日韩经典中文字幕| 成人久久精品视频| 97在线看福利| 国产精品入口夜色视频大尺度| 国产亚洲精品91在线| 中国日韩欧美久久久久久久久| 最近2019中文字幕mv免费看| 日韩在线高清视频| 亚洲尤物视频网| 久久久亚洲成人| 97视频在线看| 日韩美女免费视频| 91国自产精品中文字幕亚洲| 宅男66日本亚洲欧美视频| 亚洲人成电影网站| 亚洲男子天堂网| 亚洲精品电影网| 日韩成人在线视频网站| 亚洲尤物视频网| 欧美精品久久久久久久久久| 日韩国产高清污视频在线观看| 欧美精品一区二区免费| 国产亚洲美女久久| 久久精品色欧美aⅴ一区二区| 久久中国妇女中文字幕| 成人激情视频网| 欧美孕妇孕交黑巨大网站| 久久综合伊人77777蜜臀| 精品久久香蕉国产线看观看亚洲| 国产一区二区色| 久久国内精品一国内精品| 美日韩丰满少妇在线观看| 欧美乱大交xxxxx| 亚洲欧美一区二区三区在线| 91在线视频成人| 精品自拍视频在线观看| 国产精品白嫩初高中害羞小美女| 色婷婷av一区二区三区久久| 亚洲人精品午夜在线观看| 91av视频在线观看| 国产成人午夜视频网址| 国产伦精品免费视频| 午夜精品一区二区三区视频免费看| 欧美孕妇与黑人孕交| 亚洲一区二区三区在线视频| 日本欧美中文字幕| 国产日韩在线亚洲字幕中文| 亚洲free性xxxx护士hd| 国产精品电影一区| 亚洲国产成人久久综合| 91精品国产高清久久久久久91| 欧美激情欧美激情| 狠狠躁18三区二区一区| 黑人巨大精品欧美一区二区免费| 日韩美女视频免费看| 成人免费看黄网站| 久久精品视频va| 亚洲成人精品久久久| 精品精品国产国产自在线| 91精品国产成人| 国产成人精品一区| 色老头一区二区三区在线观看| 中文字幕在线视频日韩| 91高潮精品免费porn| 欧美另类高清videos| 久久久亚洲欧洲日产国码aⅴ| 国产国产精品人在线视| 亚洲japanese制服美女| 国产精品看片资源| 91精品在线影院| 亚洲免费电影在线观看| 亚洲精品国产精品久久清纯直播| 中文在线资源观看视频网站免费不卡| 亚洲社区在线观看| 亚洲精品视频免费| 国产亚洲欧美一区| 国产中文日韩欧美|