2017-02-17 24 views
2

我想有我枚舉與@IBInspectable容易兼容,所以爲了簡單起見,我試圖把它與Bool類型可表示:原始類型「布爾」不表達任何文字

enum TopBarStyle: Bool { 
    case darkOnLight 
    case lightOnDark 
} 

但Xcode是給我:

原始類型「布爾」是沒有任何文字

這是奇怪的表達,爲truefalse似乎是文字表達的完美候選人。

我也試圖添加RawRepresentable一致性與BOOL型:

extension Bool: RawRepresentable { 
    public init?(rawValue: Bool) { 
     self = rawValue 
    } 
    public var rawValue: Bool { 
     get { return self } 
    } 
} 

但它並沒有解決這個錯誤。

+6

的文檔解決方案是相當清楚的:https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Enumerations.html#//apple_ref/doc/uid/TP40014097-CH12-ID149:*「原始值可以是字符串,字符或任何整數或浮點數類型。* –

+0

您可以通過在計算的'var boolValue'上添加枚舉 – Connor

+0

要添加到@ MartinR的評論中,'true'和'false'不是文字,它們更接近於常量(常量的名稱由編譯器保留),文字是編譯器有一些神奇的東西轉換爲內部l值。因爲它們是關鍵字,所以沒有必要去理解「true」和「false」。 – BallpointBen

回答

0

我不認爲這是必要的。你可以做一個正常的枚舉,然後切換它的情況。另外,如果可以實現,那麼TopBarStyle(rawValue: true)意味着什麼也不清楚。

我會使用var darkOnLight: Boolenum TopBarStyle { /*cases*/ }並根據需要切換案例。

2

夫特3本身定義那些9只文字表示:

  • ExpressibleByNilLiteral(nil
  • ExpressibleByBooleanLiteral(false
  • ExpressibleByArrayLiteral([]
  • ExpressibleByDictionaryLiteral([:]
  • ExpressibleByIntegerLiteral(0
  • ExpressibleByFloatLiteral(0.0
  • ExpressibleByUnicodeScalarLiteral("\u{0}"
  • ExpressibleByExtendedGraphemeClusterLiteral("\u{0}"
  • ExpressibleByStringLiteral(""

但是enum原始表示will apparently only accept natively那些與開始representions的所述子集數字(0-9),符號(-,+)或報價("):上述列表中的最後五個協議。

在我看來,錯誤信息應該是更具體。也許一些明確的那樣本來不錯:

原始類型「布爾」是沒有任何數字或引用字符串字面

擴展表達布爾符合這些協議之一是還是可以的,例如:

extension Bool: ExpressibleByIntegerLiteral { 
    public init(integerLiteral value: Int) { 
     self = value != 0 
    } 
} 

而且這樣做後,該代碼現在建立精細:

enum TopBarStyle: Bool { 
    case darkOnLight 
    case lightOnDark 
} 

@IBInspectable var style = TopBarStyle(rawValue: false)! 
1

我對SWIFT 3

enum DataType: RawRepresentable { 
    case given 
    case recieved 

    typealias RawValue = Bool 
    var rawValue: RawValue { 
     return self == .given ? true : false 
    } 
    init?(rawValue: RawValue) { 
     self = rawValue == true ? .given : .recieved 
    } 
} 
+0

有趣。因此'擴展Bool:RawRepresentable' +'枚舉DataType:Bool'不起作用,但直接的'enum DataType:RawRepresentable'將起作用。 –

+0

請注意,這裏不需要'typealias'。 –