2016-05-18 4 views
0
enum MyBool { 
    case myTrue, myFalse 
} 

/// A value type whose instances are either `true` or `false`. 

extension MyBool { 
    /// Default-initialize Boolean value to `true`. 

    init(){ self = .myTrue } 
} 

extension MyBool : BooleanLiteralConvertible { 
    static func convertFromBooleanLiteral(value: Bool) -> MyBool { 
     return value ? myTrue : myFalse 
    } 
} 

extension MyBool : BooleanType { 
    var boolValue: Bool { 
     switch self { 
     case .myTrue: return true 
     case .myFalse: return false 
     } 
    } 
} 
extension MyBool { 
    // MyBool can be constructed from BooleanType 
    init(_ v : BooleanType) { 
     if v.boolValue { 
      self = .myTrue 
     } else { 
      self = .myFalse 
     } 
    } 
} 

問題はmyboolがプロトコルBooleanLiteralConvertibleに準拠していません。 誰も私を正しい方向に向けることができますか?boolのようなすべてのプロパティを持つカスタムブールを作成したいが、デフォルト値は "false"ではなく "true"にする必要があります。

+0

Kartikは、あなたがこれを行うにしようとしている理由を説明してくださいだろうか?これは非常に生産的ではないようです...また、BoolがSwiftのデフォルト値を具体的に持っているとは思いません。 –

+1

Swiftでは、Bool型にはデフォルト値がありません。 – vadian

+0

convertFromBooleanLiteralは非常に初期のSwiftバージョンで使用されていました。 BooleanLiteralConvertibleの現在の定義を参照してください。 –

答えて

0

BooleanLiteralConvertibleに準拠する場合は、BooleanLiteralType aka Boolを受け入れるイニシャライザを追加する必要があります。 BooleanLiteralConvertibleBooleanTypeに準拠してあなたの例を少し変更したバージョン:

enum MyBool: BooleanLiteralConvertible, BooleanType { 
    case myTrue 
    case myFalse 

    var boolValue: Bool { 
     return self == .myTrue 
    } 

    init() { 
     self = .myTrue 
    } 

    init(booleanLiteral value: Bool) { 
     self = value ? .myTrue : .myFalse 
    } 
} 
関連する問題