第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何在Swift中創(chuàng)建NS_OPTIONS樣式的位掩碼枚舉?

如何在Swift中創(chuàng)建NS_OPTIONS樣式的位掩碼枚舉?

墨色風(fēng)雨 2019-10-05 15:30:55
在Apple有關(guān)與C API交互的文檔中,他們描述了將NS_ENUM標(biāo)記的C樣式枚舉作為Swift枚舉導(dǎo)入的方式。這是有道理的,并且由于Swift中的枚舉很容易作為enum值類型提供,因此很容易看到如何創(chuàng)建我們自己的枚舉。再往下,它說了關(guān)于NS_OPTIONS標(biāo)記C樣式的選項(xiàng):Swift還會(huì)導(dǎo)入標(biāo)有NS_OPTIONS宏的選項(xiàng)。而選項(xiàng)的行為類似于進(jìn)口枚舉,選項(xiàng)還可以支持一些位操作,如&,|和~。在Objective-C中,您表示一個(gè)常量為零(0)的空選項(xiàng)集。在Swift中,用于nil表示沒有任何選項(xiàng)。鑒于optionsSwift中沒有值類型,我們?nèi)绾蝿?chuàng)建要使用的C-Style選項(xiàng)變量?
查看完整描述

3 回答

?
隔江千里

TA貢獻(xiàn)1906條經(jīng)驗(yàn) 獲得超10個(gè)贊

斯威夫特3.0

與Swift 2.0幾乎相同。OptionSetType重命名為OptionSet,并且按慣例將枚舉寫為小寫。


struct MyOptions : OptionSet {

    let rawValue: Int


    static let firstOption  = MyOptions(rawValue: 1 << 0)

    static let secondOption = MyOptions(rawValue: 1 << 1)

    static let thirdOption  = MyOptions(rawValue: 1 << 2)

}

noneSwift 3建議不要提供選項(xiàng),而只是使用空數(shù)組文字:


let noOptions: MyOptions = []

其他用法:


let singleOption = MyOptions.firstOption

let multipleOptions: MyOptions = [.firstOption, .secondOption]

if multipleOptions.contains(.secondOption) {

    print("multipleOptions has SecondOption")

}

let allOptions = MyOptions(rawValue: 7)

if allOptions.contains(.thirdOption) {

    print("allOptions has ThirdOption")

}

斯威夫特2.0

在Swift 2.0中,協(xié)議擴(kuò)展會(huì)處理大多數(shù)樣板文件,這些樣板文件現(xiàn)在已作為符合的結(jié)構(gòu)導(dǎo)入OptionSetType。(RawOptionSetType自Swift 2 beta 2起已消失。)聲明要簡(jiǎn)單得多:


struct MyOptions : OptionSetType {

    let rawValue: Int


    static let None         = MyOptions(rawValue: 0)

    static let FirstOption  = MyOptions(rawValue: 1 << 0)

    static let SecondOption = MyOptions(rawValue: 1 << 1)

    static let ThirdOption  = MyOptions(rawValue: 1 << 2)

}

現(xiàn)在我們可以使用基于集合的語義MyOptions:


let singleOption = MyOptions.FirstOption

let multipleOptions: MyOptions = [.FirstOption, .SecondOption]

if multipleOptions.contains(.SecondOption) {

    print("multipleOptions has SecondOption")

}

let allOptions = MyOptions(rawValue: 7)

if allOptions.contains(.ThirdOption) {

    print("allOptions has ThirdOption")

}

斯威夫特1.2

看著由夫特導(dǎo)入的(Objective-C的選項(xiàng)UIViewAutoresizing,例如),我們可以看到,選項(xiàng)被聲明為struct符合協(xié)議RawOptionSetType,這反過來又符合  _RawOptionSetType,Equatable,RawRepresentable,BitwiseOperationsType,和NilLiteralConvertible。我們可以這樣創(chuàng)建自己的:


struct MyOptions : RawOptionSetType {

    typealias RawValue = UInt

    private var value: UInt = 0

    init(_ value: UInt) { self.value = value }

    init(rawValue value: UInt) { self.value = value }

    init(nilLiteral: ()) { self.value = 0 }

    static var allZeros: MyOptions { return self(0) }

    static func fromMask(raw: UInt) -> MyOptions { return self(raw) }

    var rawValue: UInt { return self.value }


    static var None: MyOptions { return self(0) }

    static var FirstOption: MyOptions   { return self(1 << 0) }

    static var SecondOption: MyOptions  { return self(1 << 1) }

    static var ThirdOption: MyOptions   { return self(1 << 2) }

}

現(xiàn)在,我們可以像對(duì)待MyOptions蘋果文檔中所述的那樣對(duì)待這個(gè)新的選項(xiàng)集:您可以使用enum-like語法:


let opt1 = MyOptions.FirstOption

let opt2: MyOptions = .SecondOption

let opt3 = MyOptions(4)

而且它的行為也像我們期望的選項(xiàng)那樣:


let singleOption = MyOptions.FirstOption

let multipleOptions: MyOptions = singleOption | .SecondOption

if multipleOptions & .SecondOption != nil {     // see note

    println("multipleOptions has SecondOption")

}

let allOptions = MyOptions.fromMask(7)   // aka .fromMask(0b111)

if allOptions & .ThirdOption != nil {

    println("allOptions has ThirdOption")

}

我已經(jīng)構(gòu)建了一個(gè)生成器來創(chuàng)建Swift選項(xiàng)集,而無需進(jìn)行所有查找/替換。


最新:對(duì)Swift 1.1 beta 3的修改。


查看完整回答
反對(duì) 回復(fù) 2019-10-05
?
守候你守候我

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超10個(gè)贊

Xcode 6.1 Beta 2對(duì)RawOptionSetType協(xié)議進(jìn)行了一些更改(請(qǐng)參閱此Airspeedvelocity博客條目和Apple發(fā)行說明)。


基于Nate Cooks的示例,這里是更新的解決方案。您可以這樣定義自己的選項(xiàng)集:


struct MyOptions : RawOptionSetType, BooleanType {

    private var value: UInt

    init(_ rawValue: UInt) { self.value = rawValue }


    // MARK: _RawOptionSetType

    init(rawValue: UInt) { self.value = rawValue }


    // MARK: NilLiteralConvertible

    init(nilLiteral: ()) { self.value = 0}


    // MARK: RawRepresentable

    var rawValue: UInt { return self.value }


    // MARK: BooleanType

    var boolValue: Bool { return self.value != 0 }


    // MARK: BitwiseOperationsType

    static var allZeros: MyOptions { return self(0) }


    // MARK: User defined bit values

    static var None: MyOptions          { return self(0) }

    static var FirstOption: MyOptions   { return self(1 << 0) }

    static var SecondOption: MyOptions  { return self(1 << 1) }

    static var ThirdOption: MyOptions   { return self(1 << 2) }

    static var All: MyOptions           { return self(0b111) }

}

然后可以像這樣使用它來定義變量:


let opt1 = MyOptions.FirstOption

let opt2:MyOptions = .SecondOption

let opt3 = MyOptions(4)

像這樣測(cè)試位:


let singleOption = MyOptions.FirstOption

let multipleOptions: MyOptions = singleOption | .SecondOption

if multipleOptions & .SecondOption {

    println("multipleOptions has SecondOption")

}


let allOptions = MyOptions.All

if allOptions & .ThirdOption {

    println("allOptions has ThirdOption")

}


查看完整回答
反對(duì) 回復(fù) 2019-10-05
  • 3 回答
  • 0 關(guān)注
  • 929 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)