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

首頁(yè) > 編程 > Swift > 正文

Swift類型創(chuàng)建之自定義一個(gè)類型詳解

2020-03-09 17:50:34
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
這篇文章主要介紹了Swift類型創(chuàng)建之自定義一個(gè)類型詳解,本文講解了自定義原型、實(shí)現(xiàn)默認(rèn)值、支持基本布爾型初始化、支持Bool類型判斷、支持兼容各們各派的類型、完善OCBool的布爾基因體系等內(nèi)容,需要的朋友可以參考下
 

小伙伴們,Swift中的Bool類型有著非常重要的語(yǔ)法功能,并支撐起了整個(gè)Swift體系中的邏輯判斷體系,經(jīng)過老碼的研究和學(xué)習(xí), Bool類型本身其實(shí)是對(duì)基礎(chǔ)Boolean類型封裝,小伙伴們可能咬著手指頭問老碼,怎么一會(huì)Bool類型,一會(huì)Boolean類型,其區(qū)別在于,前者是基于枚舉的組合類型,而后者則是基本類型,只有兩種true和false。

####自定義原型

接下老碼根據(jù)Bool的思想來(lái)創(chuàng)建一個(gè)OCBool類型,來(lái)讓小伙伴們了解一下Swift中到底是怎么玩兒的。

來(lái)我們先看一下OCBool的定義。

#####代碼示例如下:

復(fù)制代碼代碼如下:

enum OCBool{
case ocTrue
case ocFalse
}

#####注意:

 

代碼中第2行和第3行,可以合并到一行寫,如蘋果官方Blog所寫的一樣
代碼中命名需要注意:OCBool是類型名,所以首字母必須大寫,而case中的ocTrue和ocFalse是小類型則需要首字母小寫。

####實(shí)現(xiàn)默認(rèn)值

行,我們給了一個(gè)漂亮的定義,不過按照傳統(tǒng)語(yǔ)言的經(jīng)驗(yàn),Bool值默認(rèn)情況下是假, 所以我們的OCBool也應(yīng)該如此,我們使用類型擴(kuò)展技術(shù)增加這個(gè)默認(rèn)特性:

復(fù)制代碼代碼如下:

extension OCBool{
     init(){
             self =.ocFalse
     }
}

 

#####注意:

●代碼中第1行:extension關(guān)鍵字,非常強(qiáng)大,小伙伴們可以通過此創(chuàng)造出許多好玩的東西,建議各位去Github上看一個(gè)名為“Swiftz”的項(xiàng)目,它將擴(kuò)展用到了極致。

●代碼中第3行:self = .ocFalse語(yǔ)法,剛?cè)腴T的小伙伴們很迷糊,為什么會(huì)有奇怪的點(diǎn)語(yǔ)法,因?yàn)榇笈hris在Swift中增加了類型智能推斷功能,在蘋果Blog中,提到了“Context”概念,就是這個(gè)意思,因?yàn)檫@行語(yǔ)句是在枚舉OCBool中的,其上下文就是OCBool的定義體,編譯器當(dāng)然知道.ocFalse就是OCBool.ocFalse了,所以這里直接點(diǎn)語(yǔ)法,非常整齊。

現(xiàn)在我們可以使用如下方法使用這個(gè)Bool類型。

#####代碼示例如下:

復(fù)制代碼代碼如下:

var result:OCBool = OCBool()
var result1:OCBool = .ocTrue

 

####支持基本布爾型初始化

正如上述代碼所述,我們只能通過類型或者枚舉項(xiàng)目賦值,這是組合類型的用法,但是編碼的日子里,我們總是希望和true,false直接打交道,也就是說(shuō),我們希望這么做,

代碼示例如下:

復(fù)制代碼代碼如下:

var isSuccess:OCBool = true

如果小伙伴們直接這么用,則會(huì)出現(xiàn)如下錯(cuò)誤:
復(fù)制代碼代碼如下:

/Users/tyrion-OldCoder/Documents/Learning/BoolType/BoolType/main.swift:30:24: Type 'OCBool' does not conform to protocol 'BooleanLiteralConvertible'

編譯器咆哮的原因是,我們的類型沒有遵從“布爾字面量轉(zhuǎn)換協(xié)議”,接下來(lái)修正這個(gè)問題,

 

#####代碼示例如下:

復(fù)制代碼代碼如下:

import Foundation

 

println("Hello, World!")

enum OCBool{
    case ocTrue
    case ocFalse
}


extension OCBool: BooleanLiteralConvertible{
static func convertFromBooleanLiteral( value: Bool) ->OCBool{
    return value ? ocTrue : ocFalse
    }
}

var isSuccess:OCBool = true

 

#####注意:

代碼中的第11行是重點(diǎn),我的類型OCBool支持了BooleanLiteralConvertible協(xié)議,這個(gè)協(xié)到底是干什么的呢,小伙伴們?cè)赬code代碼編輯器,按住Command鍵,然后點(diǎn)擊第11行中的BooleanLiteralConvertible協(xié)議名,則會(huì)進(jìn)入它的定義,

#####其定義如下:

復(fù)制代碼代碼如下:

protocol BooleanLiteralConvertible {
    typealias BooleanLiteralType
    class func convertFromBooleanLiteral(value: BooleanLiteralType) -> Self
}

這個(gè)定義中有個(gè)類方法convertFromBooleanLiteral,它的參數(shù)為BooleanLiteralType類型,也就是我傳入的Bool類型, 且返回值為實(shí)現(xiàn)這個(gè)協(xié)議的類型本身,在我們的OCBool類型中,其返回值就是OCBool本身。經(jīng)過這個(gè)定義,我們可以直接對(duì)OCBool類型直接進(jìn)行布爾字面量初始化了。

 

####支持Bool類型判斷

小伙伴們不安分, 肯定想著我怎么用它實(shí)現(xiàn)邏輯判斷,所以如果你這么寫,
#####代碼示例如下:

復(fù)制代碼代碼如下:

var isSuccess:OCBool = true

 

if isSuccess {
    println( "老碼請(qǐng)你吃火鍋!")
}


你永遠(yuǎn)吃不到老碼的火鍋,因?yàn)檫@里編譯器會(huì)咆哮:
復(fù)制代碼代碼如下:

/Users/tyrion-OldCoder/Documents/Learning/BoolType/BoolType/main.swift:27:4: Type 'OCBool' does not conform to protocol 'LogicValue'

 

OCBool現(xiàn)在只能用bool類型初始化,而不能直接返回bool型,小火把們還記得在《老碼說(shuō)編程之白話Swift江湖》中,老碼多次提到,媽媽再也不擔(dān)心我們 if a = 1{}的寫法了, 因?yàn)榈忍?hào)不支持值返回了, 所以在if判斷是后面的條件必須有返回值,OCBool沒有,所以編譯器哭了。我們解決這個(gè)問題。
#####代碼示例如下:

復(fù)制代碼代碼如下:

import Foundation

 

println("Hello, World!")

enum OCBool{
    case ocTrue
    case ocFalse
}


extension OCBool: BooleanLiteralConvertible{
static func convertFromBooleanLiteral( value: Bool) ->OCBool{
    return value ? ocTrue : ocFalse
    }
}

extension OCBool: LogicValue{
    func getLogicValue() ->Bool {
        var boolValue: Bool{
        switch self{
        case .ocTrue:
            return true
        case .ocFalse:
            return false
            }
        }
        return boolValue
    }
}


var isSuccess:OCBool = true

if isSuccess {
    println( "老碼請(qǐng)你吃火鍋!")
}

 

####運(yùn)行結(jié)果如下:

復(fù)制代碼代碼如下:

Hello, World!
老碼請(qǐng)你吃火鍋!
Program ended with exit code: 0

 

#####注意:

●如果小伙伴們現(xiàn)在用的是Beta版的Xcode,注意蘋果官方Blog中,在代碼第17行如果在Xcode Beta4下是錯(cuò)誤的,這里的協(xié)議是,LogicValue而不是BooleanVue,所以記得看錯(cuò)誤提示才是好習(xí)慣。

●注意代碼第34行,完美支持if判斷,且輸出結(jié)果為“老碼請(qǐng)你吃火鍋”,老碼也是說(shuō)說(shuō)而已,請(qǐng)不要當(dāng)真。

####支持兼容各們各派的類型

小伙伴們,江湖風(fēng)險(xiǎn),門派眾多,老碼有自己的OCBool類型,可能嵩山少林有自己的SSBool類型,甚至連郭美美都可能有自己的MMBool類型,所以O(shè)CBool必須能夠識(shí)別這些類型,這些各門各派的類型,只要支持LogicValue協(xié)議,就應(yīng)該可以被識(shí)別,看老碼怎么做,

#####代碼示例如下:

復(fù)制代碼代碼如下:

extension OCBool{
    init( _ v: LogicValue )
    {
        if v.getLogicValue(){
            self = .ocTrue
        }
        else{
            self = .ocFalse
        }
    }

 

}

var mmResult: Bool = true
var ocResult:OCBool = OCBool(mmResult)


if ocResult {
    println( "老碼沒錢,郭美美請(qǐng)你吃火鍋!")
}

 

#####代碼運(yùn)行結(jié)果如下:

復(fù)制代碼代碼如下:

Hello, World!
老碼沒錢,郭美美請(qǐng)你吃火鍋!
Program ended with exit code: 0

 

漂亮!我們的OCBool類型現(xiàn)在支持了所有的邏輯變量初始化。

#####注意:

●代碼中第2行:“_”下橫杠的用法,這是一個(gè)功能強(qiáng)大的小強(qiáng),在此的目的是屏蔽外部參數(shù)名,所以小伙伴們可以直接:var ocResult:OCBool = OCBool(mmResult)而不是:var ocResult:OCBool = OCBool(v: mmResult),小伙伴們驚呆了!這個(gè)init函數(shù)中本來(lái)就沒有外部參數(shù)名啊,還記得老碼在書里說(shuō)過沒,Swift的初始化函數(shù)會(huì)默認(rèn)使用內(nèi)部參數(shù)名,作為外部參數(shù)名。

####完善OCBool的布爾基因體系:
小伙伴們,bool類型的價(jià)值就是在于各種判斷,諸如==,!=, &,|,^,!,以及各種組合邏輯運(yùn)算,我們OCBool也要具備這些功能,否則就會(huì)基因缺陷,且看老碼如何實(shí)現(xiàn):

復(fù)制代碼代碼如下:

extension OCBool: Equatable{
}

 

//支持等值判斷運(yùn)算符
func ==( left: OCBool, right: OCBool )->Bool{
    switch (left, right){
    case (.ocTrue, .ocTrue):
            return true
    default:
        return false
    }
}
//支持位與運(yùn)算符
func &( left:OCBool, right: OCBool)->OCBool{

    if left{
        return right
    }
    else{
        return false
    }
}
//支持位或運(yùn)算符
func |( left:OCBool, right: OCBool)->OCBool{

    if left{
        return true
    }
    else{
        return right
    }
}

//支持位異或運(yùn)算符
func ^( left:OCBool, right: OCBool)->OCBool{
    return OCBool( left != right )
}
//支持求反運(yùn)算符
@prefix func !( a:OCBool )-> OCBool{
    return a ^ true
}
//支持組合求與運(yùn)算符
func &= (inout left:OCBool, right:OCBool ){
    left = left & right
}


var isHasMoney:OCBool = true
var isHasWife:OCBool = true
var isHasHealty:OCBool = true
var isHasLover:OCBool = true

isHasMoney != isHasHealty
isHasHealty == isHasMoney
isHasWife ^ isHasLover
isHasWife = !isHasLover

if (isHasMoney | isHasHealty) & isHasHealty{
    println( "人生贏家,就像老碼一樣!")
}else
{
    println("人生最苦的事事,人死了錢沒花了,人生最苦的事是,人活著,錢沒了!")
}


好了,到這里就到這里了,窗外的雷聲叫醒了老碼,現(xiàn)在應(yīng)該去吃飯了,以上老碼給大家展示了如果制造一個(gè)自己的類型,記得老碼的示例是在Xcode6 Beta4下測(cè)試的,至于Beta5的改變還沒有涉及,小伙伴們要好生練習(xí),以后各種自定類型都是基于這個(gè)思想。還有這個(gè)章節(jié)不是老碼的原創(chuàng),老碼認(rèn)真的閱讀了蘋果的官方博客,且自己的練習(xí)總結(jié),如果小伙伴們費(fèi)了吃奶的勁還是看不懂,請(qǐng)找度娘谷歌♂♂♂


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到swift教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
成人黄色网址| 成人p站proumb入口| 一本色道久久88亚洲综合88| 日韩中文在线视频| 黄色片免费大全| 免费在线观看日韩av| 成年人福利视频| 中文亚洲视频在线| 日本精品一区二区三区不卡无字幕| 麻豆精品av| 精品视频麻豆入口| 国产麻豆精品一区二区三区v视界| 在线日本中文字幕| 日韩国产在线一区| 黄网免费入口| 2023国产精品视频| 性感美女一级片| 亚洲精品乱码久久久久久9色| 麻豆免费精品视频| 国产一级做a爱免费视频| h片在线观看视频免费免费| 国产精品wwwww| www.激情.com| 成人羞羞国产免费| 九九99久久| 欧美jizzhd精品欧美另类| 男的插女的下面视频| 精品日韩一区二区三区免费视频| 国产精品人人做人人爽人人添| 国内在线观看一区二区三区| 国产欧美视频一区| 电影91久久久| 第一会所sis001亚洲| 国产精品黄页免费高清在线观看| 亚洲AV无码久久精品国产一区| 91在线视频观看| 欧美日韩高清在线| 日韩高清在线免费观看| 亚洲人成绝费网站色www| 国产h视频在线观看| 欧美在线视频导航| 亚洲一区二区在线免费观看| 国产精品久久久久久久免费| 欧美人乱大交xxxxx| 激情欧美一区二区三区黑长吊| 丝瓜av网站精品一区二区| 久久夜色精品国产噜噜av| 国产精品毛片av| 多野结衣av一区| www.91在线观看| av2020不卡| 日韩久久精品电影| 网曝91综合精品门事件在线| 97国产精品视频人人做人人爱| 亚洲sss视频| 亚洲综合999| 日本在线看片免费人成视1000| 国产精品免费麻豆入口| 成人免费自拍视频| 久久精品在这里| 国产在线视精品麻豆| 6699嫩草久久久精品影院| 亚洲av成人精品毛片| 在线播放中文字幕| www日韩中文字幕在线看| 欧美性猛交xxxx乱大交hd| 美女裸体自慰在线观看| 91亚洲精品久久久蜜桃| 韩国v欧美v日本v亚洲v| 亚洲高清精品视频| 毛片网站在线看| 男人操女人下面视频| 香港三日本8a三级少妇三级99| 国产乱一区二区| 污视频在线观看网站| 神马久久精品综合| 国产精品国产三级国产普通话对白| 林心如三级全黄裸体| 欧美日韩综合色| 黄页网站视频在线观看| av免费网站观看| 久久99久久久久久| 中文字幕在线观看精品| www.xxxx精品| 亚洲视频国产视频| 青草在线视频| 99热这里是精品| 欧美性猛交p30| 日本精品视频一区二区| 亚洲精品国自产拍在线观看| 久久福利影院| 久久久久亚洲| 国产国产人免费人成免费视频| 在线观看国产精品入口男同| 国产不卡精品| 波多野吉衣中文字幕| 日韩亚洲天堂| 日韩av片电影专区| 91在线播放观看| 久久一区二区三区喷水| 18深夜在线观看免费视频| 国产日韩欧美不卡| 久久久久久99久久久精品网站| 国产成人无码av在线播放dvd| 国产不卡123| 天涯成人国产亚洲精品一区av| 久久久久中文| 中国一级特黄视频| 精品久久久久久久久久久院品网| 久久人人爽国产| 无码人妻aⅴ一区二区三区有奶水| 日韩久久精品电影| 日韩一区二区三区视频在线| 亚洲精品国偷自产在线99热| 91精品亚洲一区在线观看| 黑人巨大精品欧美一区二区免费| 亚洲深夜影院| 亚洲xxxxx性| 久久久久久久综合| 丁香花在线影院观看在线播放| 狠狠躁夜夜躁人人躁婷婷91| 欧美亚洲免费| 99精品一区二区| 亚洲精品一区二区三区新线路| 国产三级精品三级观看| 在线不卡a资源高清| 北条麻妃99精品青青久久| 国产伦视频一区二区三区| 日本精品免费观看高清观看| 91在线国内视频| 在线播放日韩精品| 国产精品夜间视频香蕉| 亚洲精品麻豆| 国产真实伦在线观看| 成人一级片网址| 国产一区二区三区三州| 成人一区二区在线观看| 精品奇米国产一区二区三区| 日日噜噜夜夜狠狠| 国产乱了高清露脸对白| 91大神免费观看| 污污视频在线观看网站| 7799精品视频天天看| 国产免费福利网站| 一区二区视频观看| 久久精品道一区二区三区| 亚洲av成人精品日韩在线播放| 日本精品视频一区二区| 一二三区在线播放| 第四色播日韩| 韩国成人二区| 中文字幕av专区| 欧美网站一区二区| 亚洲一级免费在线观看| 依依成人在线视频| 欧美日韩一级大片网址| 女人18毛片毛片毛片毛片区二| 久久五月激情| 日本激情视频在线观看| 亚洲视频综合网| 成年网站在线视频网站| 国产乱国产乱300精品| 九九热久久免费视频| 日韩av影音先锋| 国产精品igao视频| 成年人黄国产| 黄色仓库视频网站| 浓精h攵女乱爱av| 日本三级中文字幕在线观看| 手机在线观看国产精品| 波多野结衣在线| 久久久久久久电影| 亚洲国产精品日韩专区av有中文| 精品午夜一区二区三区| 午夜精品国产精品大乳美女| 久久久蜜桃一区二区人| 国产v片免费观看| 九色视频在线播放| 欧美日韩亚洲丝袜制服| www.国产麻豆| 一级片黄色免费| 亚洲男女性事视频| 天堂中文av在线资源库| 日本在线播放不卡| 免费在线看污片| 亚洲精品一二三四五区| 午夜激情久久久| 久久久久久亚洲综合影院红桃| 午夜在线视频播放| 视频在线一区二区三区| 77777_亚洲午夜久久多人| 国产精品一区二区亚洲| 日本一二三区在线观看| h片在线观看免费| 欧美黄网免费在线观看| 欧美视频国产视频| 色999日韩欧美国产| 日韩精品福利一区二区三区| 精品国产一级毛片| 国内精品露脸在线视频播放| 久久久久女教师免费一区| 在线天堂中文www官网| 日本一区二区免费在线观看视频| 国产精品丝袜黑色高跟鞋| 精品一区二区三区在线观看| 久久亚洲一区二区三区明星换脸| 亚洲精品美国一| 国产91足控脚交在线观看| 国产男男chinese网站| 国产一区二区不卡在线| 亚洲av成人精品一区二区三区| 欧美深夜福利| 欧美吻胸吃奶大尺度电影| 无码小电影在线观看网站免费| 亚洲三级在线免费观看| 欧美私人网站| 国产成人免费av一区二区午夜| 亚洲成人影院麻豆| 永久免费看mv网站入口亚洲| 色悠久久久久综合欧美99| 国产一区国产精品| 欧美天堂亚洲电影院在线观看| 欧美香蕉爽爽人人爽| 国产精品麻豆免费版现看视频| 日本天堂在线播放| 日日夜夜亚洲精品| 亚洲一区二区少妇| 日韩欧美在线免费| 日本黄色片一级片| 欧美精品一区二区免费| 国产欧美一二三区| 九色蝌蚪在线| 日韩在线观看免费全集电视剧网站| 有色视频在线观看| 中国女人内谢25xxxx免费视频| 日本在线视频www色| 国模人体一区二区| 久久精品日韩| 欧美黑人极品猛少妇色xxxxx| 手机在线理论电影| 婷婷成人综合| 亚洲精品国自产拍在线观看| 激情深爱综合网| 日韩a**中文字幕| 95精品视频在线| 成人午夜碰碰视频| 美女国产精品| 久久久久久国产精品免费无遮挡| 色哟哟精品丝袜一区二区| 可以直接看的无码av| 亚洲精品一区在线观看| 国产又黄又嫩又滑又白| 亚洲一级av毛片| 欧美行性性性o00x| 久久久久久久久久久一区| 91在线超碰| 国产一级视频| 9色porny| 久久综合九色综合97婷婷| 超碰个人在线| 日日夜夜精品视频免费观看| 一区二区三区福利视频| 国产成人精品久久亚洲高清不卡| 久久av偷拍| 日韩精品久久久毛片一区二区| 国产精品日韩欧美综合| 成人高清伦理免费影院在线观看| 亚洲精品中文字幕乱码无线| 一区精品在线| 日韩a级作爱片一二三区免费观看| 中文字幕久久亚洲| 欧美成人高清视频在线观看| 久久久精品一品道一区| 日韩精品电影| 欧美xxxxbbbb| 国产伦精品一区二区| 成人av手机在线观看| 国产一区二区三区高清播放| av中文在线资源库| 久久成人这里只有精品| 亚洲欧洲一区| 日韩欧美一二区| 日本黄大片在线观看| 一本久久a久久精品vr综合| 一片黄亚洲嫩模| 国产黄色91视频| 久久久久在线观看| 久久久久中文字幕亚洲精品| 丰满人妻一区二区三区53号| 国产精品久久久久久久av| 亚洲成人a级片| 欧美第一页草草影院浮力| 97se亚洲国产综合自在线观| 亚洲乱码国产乱码精品| 日本天堂在线视频| 成人自拍视频在线| 免费看一区二区三区| 999精品嫩草久久久久久99| 国产亚洲精品久久久久久| 天堂а√在线最新版中文在线| 一区二区视频免费看| 青青影院一区二区三区四区| 日本а中文在线天堂| 久久久久无码国产精品| 亚洲色图 校园春色| 久久99精品久久久久久青青日本| 欧美一区二区不卡视频| 在线播放亚洲精品| 国产精品久久久一区二区三区| 久久国产午夜精品理论片最新版本| 国产欧美精品一区二区| 日韩欧美成人一区二区| 亚洲一区免费看| 4438x成人网最大色成网站| mm1313亚洲国产精品美女| 精品伦精品一区二区三区视频密桃| 最新在线观看av网站| 国产高清无密码一区二区三区| 五月激情四射婷婷| 亚洲h视频在线观看| 第四色日韩影片| 波多野结衣在线观看一区| 亚洲免费在线观看av| 久久精品小视频| 国产欧美最新羞羞视频在线观看| 欧美日韩一区综合| 精品在线免费观看| 91精品久久久久久|