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

首頁 > 編程 > Swift > 正文

Swift類型創建之自定義一個類型詳解

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

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

####自定義原型

接下老碼根據Bool的思想來創建一個OCBool類型,來讓小伙伴們了解一下Swift中到底是怎么玩兒的。

來我們先看一下OCBool的定義。

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

復制代碼代碼如下:

enum OCBool{
case ocTrue
case ocFalse
}

#####注意:

 

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

####實現默認值

行,我們給了一個漂亮的定義,不過按照傳統語言的經驗,Bool值默認情況下是假, 所以我們的OCBool也應該如此,我們使用類型擴展技術增加這個默認特性:

復制代碼代碼如下:

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

 

#####注意:

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

●代碼中第3行:self = .ocFalse語法,剛入門的小伙伴們很迷糊,為什么會有奇怪的點語法,因為大牛Chris在Swift中增加了類型智能推斷功能,在蘋果Blog中,提到了“Context”概念,就是這個意思,因為這行語句是在枚舉OCBool中的,其上下文就是OCBool的定義體,編譯器當然知道.ocFalse就是OCBool.ocFalse了,所以這里直接點語法,非常整齊。

現在我們可以使用如下方法使用這個Bool類型。

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

復制代碼代碼如下:

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

 

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

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

代碼示例如下:

復制代碼代碼如下:

var isSuccess:OCBool = true

如果小伙伴們直接這么用,則會出現如下錯誤:
復制代碼代碼如下:

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

編譯器咆哮的原因是,我們的類型沒有遵從“布爾字面量轉換協議”,接下來修正這個問題,

 

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

復制代碼代碼如下:

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行是重點,我的類型OCBool支持了BooleanLiteralConvertible協議,這個協到底是干什么的呢,小伙伴們在Xcode代碼編輯器,按住Command鍵,然后點擊第11行中的BooleanLiteralConvertible協議名,則會進入它的定義,

#####其定義如下:

復制代碼代碼如下:

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

這個定義中有個類方法convertFromBooleanLiteral,它的參數為BooleanLiteralType類型,也就是我傳入的Bool類型, 且返回值為實現這個協議的類型本身,在我們的OCBool類型中,其返回值就是OCBool本身。經過這個定義,我們可以直接對OCBool類型直接進行布爾字面量初始化了。

 

####支持Bool類型判斷

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

復制代碼代碼如下:

var isSuccess:OCBool = true

 

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


你永遠吃不到老碼的火鍋,因為這里編譯器會咆哮:
復制代碼代碼如下:

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

 

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

復制代碼代碼如下:

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( "老碼請你吃火鍋!")
}

 

####運行結果如下:

復制代碼代碼如下:

Hello, World!
老碼請你吃火鍋!
Program ended with exit code: 0

 

#####注意:

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

●注意代碼第34行,完美支持if判斷,且輸出結果為“老碼請你吃火鍋”,老碼也是說說而已,請不要當真。

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

小伙伴們,江湖風險,門派眾多,老碼有自己的OCBool類型,可能嵩山少林有自己的SSBool類型,甚至連郭美美都可能有自己的MMBool類型,所以OCBool必須能夠識別這些類型,這些各門各派的類型,只要支持LogicValue協議,就應該可以被識別,看老碼怎么做,

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

復制代碼代碼如下:

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( "老碼沒錢,郭美美請你吃火鍋!")
}

 

#####代碼運行結果如下:

復制代碼代碼如下:

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

 

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

#####注意:

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

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

復制代碼代碼如下:

extension OCBool: Equatable{
}

 

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

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

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

//支持位異或運算符
func ^( left:OCBool, right: OCBool)->OCBool{
    return OCBool( left != right )
}
//支持求反運算符
@prefix func !( a:OCBool )-> OCBool{
    return a ^ true
}
//支持組合求與運算符
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("人生最苦的事事,人死了錢沒花了,人生最苦的事是,人活著,錢沒了!")
}


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


注:相關教程知識閱讀請移步到swift教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
…久久精品99久久香蕉国产| 国产一区二区三区视频免费| 日韩av色在线| 91在线观看免费| 2018中文字幕一区二区三区| 91精品视频在线免费观看| 亚洲аv电影天堂网| 国产欧美日韩高清| 成人福利在线视频| 97视频在线观看网址| 亚洲欧美国产精品va在线观看| 成人写真视频福利网| 日本aⅴ大伊香蕉精品视频| 欧美日韩色婷婷| 国产欧美 在线欧美| 中文字幕欧美精品在线| 欧美激情国内偷拍| 欧美俄罗斯性视频| 亚洲已满18点击进入在线看片| 色一情一乱一区二区| 中文字幕精品一区二区精品| 欧美大片欧美激情性色a∨久久| 成人黄色中文字幕| 精品国产一区二区三区久久久| 在线日韩欧美视频| 久久久久久久成人| 中文字幕精品视频| 亚洲国产91色在线| 超碰91人人草人人干| 欧美性精品220| 午夜欧美大片免费观看| 成人疯狂猛交xxx| 亚洲成人久久网| 一个人看的www欧美| 国产成人精品电影久久久| 国产在线拍偷自揄拍精品| 亚洲精品乱码久久久久久金桔影视| 国产日韩综合一区二区性色av| 国产激情久久久久| 久久久久免费视频| 精品一区二区三区电影| 亚洲天堂网站在线观看视频| 97香蕉久久夜色精品国产| 国产91精品最新在线播放| 中文字幕自拍vr一区二区三区| 日韩男女性生活视频| 性欧美xxxx交| 日韩专区中文字幕| 久久久亚洲欧洲日产国码aⅴ| 亚洲第一av在线| 最新日韩中文字幕| 欧美精品在线免费| 51久久精品夜色国产麻豆| 国产免费一区二区三区香蕉精| 亚洲日韩中文字幕| 亚洲精品美女久久久久| 国产日韩中文字幕| 国产suv精品一区二区| 久久中文久久字幕| 亚洲欧美日韩第一区| 亚洲男女自偷自拍图片另类| 国产精品免费看久久久香蕉| 在线观看欧美日韩国产| 亚洲成avwww人| 国产97在线|日韩| 日韩亚洲国产中文字幕| 久久久天堂国产精品女人| 国产精品视频白浆免费视频| 97国产精品视频| 久久在线免费观看视频| 国产ts人妖一区二区三区| 91国内揄拍国内精品对白| 久久久久中文字幕| 这里只有精品久久| 97在线免费观看视频| 国产成人av网| 欧美猛交ⅹxxx乱大交视频| 国产精品久久久久久av福利软件| 国产91色在线免费| 97在线视频精品| 亚洲一区中文字幕在线观看| 国产精品久久久久久婷婷天堂| 91色精品视频在线| 亚洲精品一区二区在线| 国产一区二区三区三区在线观看| 日本高清不卡的在线| 在线精品视频视频中文字幕| 日韩在线观看av| 日本视频久久久| xxxxx91麻豆| 97久久精品在线| 91av在线看| 最新国产精品拍自在线播放| 国产日韩在线精品av| 成人午夜一级二级三级| 午夜免费久久久久| 欧美日产国产成人免费图片| 性色av一区二区三区| 国产精品福利在线| 色综合久久久久久中文网| 色阁综合伊人av| 亚洲视频777| 日韩精品在线播放| 亚洲精品影视在线观看| 最近中文字幕mv在线一区二区三区四区| 最近2019中文字幕大全第二页| 国产亚洲精品久久久久久牛牛| 日本三级韩国三级久久| 亚洲欧美国产制服动漫| 欧美综合激情网| 高清一区二区三区日本久| 亚洲性生活视频| 国产精品精品久久久久久| 亚洲小视频在线观看| 国产精品九九久久久久久久| 亚洲毛片在线观看| 亚洲天堂男人的天堂| 国产精品久久久久久久一区探花| 亚洲欧美资源在线| 欧美电影免费在线观看| 欧美电影免费观看大全| 奇米影视亚洲狠狠色| 欧美一区在线直播| 亚洲欧美一区二区三区久久| 91精品久久久久久综合乱菊| 在线电影欧美日韩一区二区私密| 欧美俄罗斯乱妇| 国产裸体写真av一区二区| 欧美裸体xxxxx| 精品久久久久久国产| 日韩av一区二区在线观看| 日韩欧美亚洲一二三区| 亚洲欧美制服中文字幕| www.99久久热国产日韩欧美.com| 国产激情999| 欧美性猛交xxxx黑人| 亚洲男人的天堂在线| 2019日本中文字幕| 国产欧美久久久久久| 日本精品va在线观看| 26uuu日韩精品一区二区| 欧美激情免费看| 色综久久综合桃花网| 亚洲性日韩精品一区二区| 欧美男插女视频| 国产欧美精品久久久| 26uuu亚洲国产精品| 国产精品久久久久久久久男| 69国产精品成人在线播放| 91国产美女视频| 久久亚洲精品毛片| 国产91露脸中文字幕在线| 日本成人免费在线| 亚洲一区亚洲二区亚洲三区| 中文字幕欧美日韩va免费视频| 欧洲亚洲免费在线| 91精品国产91久久| 亚洲精品wwww| 日韩av在线高清| 欧美性高潮在线| 尤物精品国产第一福利三区| 欧美日韩一区二区精品| 亚洲资源在线看| 久久久久久久久久久av|