2017-02-20 64 views
0

的int值中我有自定義對象A的財產數組ZZ斯威夫特減少 - 添加字符串

String a1 

我想補充的所有元素的a1屬性數組中,並返回一個NSNumber值。由於值a1是一個字符串,我也必須在旅途中將它轉換爲雙精度值。

我試圖做的東西線:

ZZ?.reduce(0, {$0.Int(a1) + $1.Int(a1)}) 

,但得到很多關於語法錯誤的。

我該怎麼辦?

回答

1

它應該是這樣的。

如果字符串包含Double值:

let result = zz.reduce(0) { $0 + Double($1.a1) ?? 0.0 } 

如果字符串包含Int值:

let result = zz.reduce(0) { $0 + Int($1.a1) ?? 0 } 
0

假設非可轉換字符串到雙指0.0值...

public class Custom 
{ 
    public var theProperty: String 

    public init(value: String) 
    { 
     self.theProperty = value 
    } 
} 

let c1: Custom = Custom(value: "1.1") 
let c2: Custom = Custom(value: "a") 
let c3: Custom = Custom(value: "3.2") 

let array: [Custom] = [ c1, c2, c3 ] 

let result: Double = array.map({ 
    guard let theProperty = Double($0.theProperty) else 
    { 
     return 0.0 
    } 

    return theProperty 

}) 
.reduce(0.0) { $0 + $1 } 

print(result) 
1

作爲直接使用reduce的替代方法在zz陣列上,可以一個flatMap呼叫上zz,此後在應用reduce總結其被成功初始化爲Double實例元素內施加的zz每個元件的a1構件的嘗試Double初始化(由failable init?(_:String) initializer of Double)。

struct Custom { 
    let a1: String 
    init(_ a1: String) { self.a1 = a1 } 
} 

let zz: [Custom] = [Custom("1.4"), Custom("z"), Custom("3.1")] 

let sumOfValids = zz.lazy.flatMap{ Double($0.a1) }.reduce(0, +) // 4.5 

對於最後一部分(如果你真的想這樣)

「我想補充的所有元素的A1屬性陣列 並返回NSNumber

您可以簡單地使用appropriate NSNumber by Double initializer

最後請注意,以上都不是執行的嘗試鑄造StringDouble,而是由String值企圖Double初始化,通過String初始化在LosslessStringConvertible blueprinted,利用該failable的哪個Double符合。

「因爲值a1String,我還必須將它轉換成一個 Double在旅途太」