程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> Swift類型創立之自界說一個類型詳解

Swift類型創立之自界說一個類型詳解

編輯:更多關於編程

Swift類型創立之自界說一個類型詳解。本站提示廣大學習愛好者:(Swift類型創立之自界說一個類型詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是Swift類型創立之自界說一個類型詳解正文


小同伴們,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的轉變還沒有觸及,小同伴們要好生演習,今後各類自定類型都是基於這個思惟。還有這個章節不是老碼的原創,老碼賣力的浏覽了蘋果的官方博客,且本身的演習總結,假如小同伴們費了吃奶的勁照樣看不懂,請找度娘谷歌♂♂♂

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved