欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2015年05月25日 11:41:00   投稿:junjie  
這篇文章主要介紹了Swift類型創(chuàng)建之自定義一個類型詳解,本文講解了自定義原型、實現(xiàn)默認值、支持基本布爾型初始化、支持Bool類型判斷、支持兼容各們各派的類型、完善OCBool的布爾基因體系等內(nèi)容,需要的朋友可以參考下

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

####自定義原型

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

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

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

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

enum OCBool{
case ocTrue
case ocFalse
}

#####注意:

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

####實現(xiàn)默認值

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

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

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

#####注意:

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

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

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

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

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

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

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

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

代碼示例如下:

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

var isSuccess:OCBool = true

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

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

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

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

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

#####其定義如下:

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

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

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

####支持Bool類型判斷

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

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

var isSuccess:OCBool = true

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


你永遠吃不到老碼的火鍋,因為這里編譯器會咆哮:
復(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型,小火把們還記得在《老碼說編程之白話Swift江湖》中,老碼多次提到,媽媽再也不擔心我們 if a = 1{}的寫法了, 因為等號不支持值返回了, 所以在if判斷是后面的條件必須有返回值,OCBool沒有,所以編譯器哭了。我們解決這個問題。
#####代碼示例如下:

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

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

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

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

#####注意:

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

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

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

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

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

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

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

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

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

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

#####注意:

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

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

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

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("人生最苦的事事,人死了錢沒花了,人生最苦的事是,人活著,錢沒了!")
}


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

相關(guān)文章

  • 通過示例分析Swift單例模式

    通過示例分析Swift單例模式

    這篇文章主要介紹了通過示例分析Swift單例模式的三種方法,分別是全局變量,內(nèi)部變量,dispatch_once方式,有需要的小伙伴可以參考下。
    2015-06-06
  • 詳解swift中xcworkspace多項目管理

    詳解swift中xcworkspace多項目管理

    給大家詳細講解了IOS開發(fā)中swift語言xcworkspace多項目管理的方法和介紹,一起參考一下。
    2017-11-11
  • swift 錯誤處理do catch try try!使用詳解

    swift 錯誤處理do catch try try!使用詳解

    這篇文章主要介紹了swift 錯誤處理do catch try try!使用詳解的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • swift實現(xiàn)簡易計算器項目

    swift實現(xiàn)簡易計算器項目

    這篇文章主要為大家詳細介紹了swift實現(xiàn)簡易計算器項目,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Swift 常量與變量實例詳解

    Swift 常量與變量實例詳解

    這篇文章主要介紹了Swift 常量與變量實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • switch實現(xiàn)一個兩數(shù)的運算代碼示例

    switch實現(xiàn)一個兩數(shù)的運算代碼示例

    這篇文章主要介紹了switch實現(xiàn)一個兩數(shù)的運算代碼示例,需要的朋友可以參考下
    2017-06-06
  • swift 可選型的使用詳解

    swift 可選型的使用詳解

    可選性是Swift提供的一個特殊類型,它為我們編寫程序提供便利的條件。這篇文章主要介紹了swift 可選型的使用詳解,非常不錯具有參考借鑒價值,需要的朋友可以參考下
    2016-10-10
  • Swift中添加雙擊手勢識別器

    Swift中添加雙擊手勢識別器

    在這次IOS應(yīng)用開發(fā)教程中,我們打算實現(xiàn)手勢識別。正如你所知道的,IOS支持大量的手勢操作,它們能提供了很好的應(yīng)用控制和出色用戶體驗。
    2019-08-08
  • Swift 3.0 enum 的靈活使用介紹

    Swift 3.0 enum 的靈活使用介紹

    這篇文章主要介紹了Swift 3.0 enum 的靈活使用介紹,非常具有實用價值,需要的朋友可以參考下
    2017-05-05
  • swift 3.0中realm封裝類示例代碼

    swift 3.0中realm封裝類示例代碼

    這篇文章主要給大家介紹了關(guān)于swift 3.0中realm封裝類的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用swift具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-10-10

最新評論