2017-06-26 26 views
1

這個名單是這樣的:分配可變參數的參數變量

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

這是從服務器的響應:

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

現在我需要創建的NodeFeatures只有true值的實例:

var features = [NodeFeature]() // how to declare and prepare the list of args? 

if true { 
    features.append(.first) 
} else if true { 
    features.append(.third) 
} 

let wrapper = NodeFeatures(features: features) //... to pass it as a variable to the initializer. 

但是錯誤如下:

無法將類型一個可變參數的「[NodeFeature]」到預期參數類型「NodeFeatures」

+0

嘗試改變的init(功能:功能...)來初始化(特點: [Feature])。您正在初始化多個枚舉情況而不是單個情況。 –

+0

不,不是這種情況,我需要從另一邊準備:)初始化程序中的參數來自SDK ... –

+0

您可以提供更多信息嗎?您正在使用init()完成的部分。是明確的參數類型不匹配。 –

回答

2

不能傳遞數組給一個函數採取可變參數的參數, 或動態地「建立」值參數列表,比較例如 Passing an array to a function with variable number of args in Swift

不過幸運的是,該類型有另一初始化

public init(rawValue: UInt16) 

,你可以以不同的方式使用。

選項1:使用的整數位掩碼來組裝功能 而不是數組:

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

選項2:保持你的數組,但計算組合原始值 創建NodeFeatures值:

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) 

選項3:默認值INE另一個初始化服用數組參數 在擴展:

extension NodeFeatures { 

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

現在你可以直接通過您的數組:

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

當您更新SDK時,請小心保持init例程與SDK的init同步。他們可能會改變init的功能。 – vacawama

+1

謝謝你,你總是非常有幫助:) –