2017-06-26 4 views
1

Dies ist der Fall:Assign Liste der variadische Parameter Variable

public enum NodeFeature: UInt16 { 
    case relay  = 0x01 
    case proxy  = 0x02 
    case friend  = 0x04 
    case lpn  = 0x08 
} 

public struct NodeFeatures { 
    public let rawValue: UInt16 

    public init(rawValue: UInt16) { 
     self.rawValue = rawValue 
    } 

    public init(features: NodeFeature...) { 
     var rawValue = UInt16(0) 
     for feature in features { 
      rawValue |= feature.rawValue 
     } 
     self.rawValue = rawValue 
    } 

    public func hasFeature(_ feature: NodeFeature) -> Bool { 
     return rawValue & feature.rawValue > 0 
    } 
} 

Und das ist eine Antwort vom Server:

"feature": { 
    "relay": true, 
    "proxy": false, 
    "friend": false, 
    "lowPower": false 
} 

Jetzt brauche ich eine Instanz von NodeFeatures mit nur true Werte zu schaffen :

Aber der Fehler folgt:

Wert kann nicht vom Typ umwandeln "[NodeFeature] Typ erwartete Argument‚NodeFeatures‘

+0

Versuch init zu ändern (Features: Feature ...) (Funktionen init: [Feature]). Sie initialisieren mehrere Enum-Cases anstelle von Single. –

+0

Nein, das ist nicht der Fall, ich muss es von der anderen Seite vorbereiten :) Das Argument im Initialisierer stammt vom SDK ... –

+0

Kannst du mehr Infos geben? Was machst du genau mit init() part.The Fehler ist klar, dass der Argumenttyp nicht übereinstimmt. –

Antwort

2

Sie nicht ein Array an eine Funktion nimmt ein variadische Argument einer variadische passieren kann, oder dynamisch„bauen“ Argumentliste, vergleiche zB Passing an array to a function with variable number of args in Swift.

Aber zum Glück hat der Typ eine andere initializer

public init(rawValue: UInt16) 

, die Sie auf unterschiedliche Weise nutzen können.

Option 1: Verwenden eine ganze Zahl Bitmaske die Eigenschaften anstelle eines Arrays zu montieren:

var rawFeatures = UInt16(0) 
if condition { 
    rawFeatures |= NodeFeature.relay.rawValue 
} else if condition { 
    rawFeatures |= NodeFeature.proxy.rawValue 
} 
let wrapper = NodeFeatures(rawValue: rawFeatures) 

Option 2: Halten Sie Ihr Array, sondern berechnen die kombinierte Rohwert erstellen die NodeFeatures Wert:

var features = [NodeFeature]() 
if condition { 
    features.append(.relay) 
} else if condition { 
    features.append(.proxy) 
} 

let rawFeatures = features.reduce(0, { $0 | $1.rawValue }) 
let wrapper = NodeFeatures(rawValue: rawFeatures) 

Option 3: Def ine andere initializer ein Array Argument in einer Verlängerung unter:

extension NodeFeatures { 

    public init(features: [NodeFeature]) { 
     let rawValue = features.reduce(0, { $0 | $1.rawValue }) 
     self.init(rawValue: rawValue) 
    } 
} 

Jetzt können Sie Ihre Array direkt übergeben:

var features = [NodeFeature]() 
if condition { 
    features.append(.relay) 
} else if condition { 
    features.append(.proxy) 
} 
let wrapper = NodeFeatures(features: features) 
+0

Achten Sie darauf, dass Ihre Init-Routine beim Aktualisieren des SDK mit der Init des SDK synchronisiert bleibt. Sie könnten ändern, was init tut. – vacawama

+1

Danke, du bist immer sehr hilfsbereit :) –

Verwandte Themen