SORU
5 HAZİRAN 2014, PERŞEMBE


Nasıl NS_OPTİONS tarzı Swift Listeleme bit maskesi oluşturmak için?

Apple'ın C API ile etkileşim hakkında belgeleri, NS_ENUMişaretli tanımlar C-stil numaralandırma numaralandırma Swift olarak alınır. Bu mantıklı, ve Swift numaralandırma kolayca enum değer türü olarak sağlanmış olması nedeniyle kolay bizim kendi oluşturmak için nasıl görmek için.

Daha aşağı, NS_OPTIONSişaretli C-stil seçenekleri: bu konuda yazıyor

Hızlı da seçenekleri NS_OPTIONS makro ile işaretlenmiş alır. Oysa seçenekleri aynı şekilde ithal Listeleme seçenekleri de uslu bazı bit düzey işlemleri, &, | ~ gibi destek. Objective-C, boş bir seçenek sürekli sıfır (0) temsil ediyorsunuz. İçinde Swift, nil herhangi bir seçenek yokluğu göstermek için kullanın.

Swift options değer bir tür olmadığını düşünürsek, ne kadar C-Stil seçenekleri bir değişken ile çalışmak oluşturabilir miyiz?

CEVAP
5 HAZİRAN 2014, PERŞEMBE


Hızlı 2.0

Swift 2.0, protokol uzantıları şimdi OptionSetType uygun bir yapı olarak ithal edilen bu klişe, en iyi bak. (RawOptionSetType Swift 2 beta olarak 2. kayboldu) Bildirimi çok daha basittir:

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)
}

Şimdi set-tabanlı semantik MyOptions ile kullanabiliriz:

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")
}

Swift 1.2

Bakıyor Objective-C seçenekleri vardı ithal ederek Swift (UIViewAutoresizing, örneğin), bunu görebiliyoruz seçenek olarak ilan etmişti struct uyan protokolü RawOptionSetType, hangi sırayla uyan _RawOptionSetType, Equatable, RawRepresentable, BitwiseOperationsType, ve NilLiteralConvertible. Bu gibi kendi oluşturabilirsiniz:

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) }
}

Şimdi Apple'ın belgelerinde açıklandığı gibi bu yeni seçeneği ayarlayın MyOptions, tedavi edebiliriz: enum-gibi sözdizimi: kullanabilirsiniz

let opt1 = MyOptions.FirstOption
let opt2: MyOptions = .SecondOption
let opt3 = MyOptions(4)

Ve aynı zamanda seçenekleri davranır beklediğimiz gibi davranır:

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")
}

/Yerini bulmak olmadan generator to create a Swift option set bir inşa ettik.

En son:Swift 1.1 değişiklikler beta 3.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Dirty Loops

    Dirty Loops

    21 Mayıs 2007
  • Flohoo

    Flohoo

    12 EYLÜL 2009
  • Rayone GB

    Rayone GB

    14 Temmuz 2007