回答:
これは私が見つけることができる最も簡単な/最短の方法です。
Swift 3およびSwift 4:
let multiples = [...]
let sum = multiples.reduce(0, +)
print("Sum of Array is : ", sum)
スウィフト2:
let multiples = [...]
sum = multiples.reduce(0, combine: +)
さらに詳しい情報:
これは、Arrayのreduceメソッド(ここに記載されているドキュメント)を使用して、「提供されたクロージャーを再帰的に適用することにより、要素のコレクションを単一の値に減らす」ことができます。初期値として0を指定し、基本的にクロージャを指定し{ $0 + $1 }
ます。もちろん、これをSwiftのローリング方法と同じように、1つのプラス記号に簡略化できます。
combine
。する必要がありますmultiples.reduce(0, combine: +)
。
flatMap
最初にon を使用して、1次元配列にフラット化してみてください。multiArray.flatMap{$0}.reduce(0, combine: +)
Swift 4では、シーケンス要素を数値プロトコルに制限して、次のようにシーケンス内のすべての要素の合計を返すこともできます。
extension Sequence where Element: Numeric {
/// Returns the sum of all elements in the collection
func sum() -> Element { return reduce(0, +) }
}
編集/更新:
Xcode 10.2•Swift 5以降
シーケンス要素を新しいAdditiveArithmeticプロトコルに制約するだけで、コレクション内のすべての要素の合計を返すことができます
extension Sequence where Element: AdditiveArithmetic {
func sum() -> Element {
return reduce(.zero, +)
}
}
Xcode 11•Swift 5.1以降
extension Sequence where Element: AdditiveArithmetic {
func sum() -> Element { reduce(.zero, +) }
}
let numbers = [1,2,3]
numbers.sum() // 6
let doubles = [1.5, 2.7, 3.0]
doubles.sum() // 7.2
スウィフト3
一般的なオブジェクトの配列があり、オブジェクトのプロパティを合計したい場合:
class A: NSObject {
var value = 0
init(value: Int) {
self.value = value
}
}
let array = [A(value: 2), A(value: 4)]
let sum = array.reduce(0, { $0 + $1.value })
// ^ ^
// $0=result $1=next A object
print(sum) // 6
短い形式にもかかわらず、多くの場合、古典的なforサイクルを好むことがあります。
let array = [A(value: 2), A(value: 4)]
var sum = 0
array.forEach({ sum += $0.value})
// or
for element in array {
sum += element.value
}
簡単な方法はどうですか
for (var i = 0; i < n; i++) {
sum = sum + Int(multiples[i])!
}
// n =配列の要素数
var sum = 0 ; for n in multiples { sum += n }
リデュースを使用しますが。
考えられる解決策:プレフィックス演算子を定義します。APL(例:GNU APL)の場合と同様に、reduce "+ /"演算子のように
ここで少し異なるアプローチ。
プロトコルジェネリック型を使用すると、この演算子をDouble、Float、およびInt配列型で使用できます
protocol Number
{
func +(l: Self, r: Self) -> Self
func -(l: Self, r: Self) -> Self
func >(l: Self, r: Self) -> Bool
func <(l: Self, r: Self) -> Bool
}
extension Double : Number {}
extension Float : Number {}
extension Int : Number {}
infix operator += {}
func += <T:Number> (inout left: T, right: T)
{
left = left + right
}
prefix operator +/ {}
prefix func +/ <T:Number>(ar:[T]?) -> T?
{
switch true
{
case ar == nil:
return nil
case ar!.isEmpty:
return nil
default:
var result = ar![0]
for n in 1..<ar!.count
{
result += ar![n]
}
return result
}
}
次のように使用します:
let nmbrs = [ 12.4, 35.6, 456.65, 43.45 ]
let intarr = [1, 34, 23, 54, 56, -67, 0, 44]
+/nmbrs // 548.1
+/intarr // 145
(Swift 2.2用に更新、Xcodeバージョン7.3でテスト済み)
Swift 3.0
私は同じ問題がありました、私はドキュメントAppleでこの解決策を見つけました。
let numbers = [1, 2, 3, 4]
let addTwo: (Int, Int) -> Int = { x, y in x + y }
let numberSum = numbers.reduce(0, addTwo)
// 'numberSum' == 10
しかし、私の場合、オブジェクトのリストがあり、リストの値を変換する必要がありました。
let numberSum = self.list.map({$0.number_here}).reduce(0, { x, y in x + y })
この仕事は私にとって。
@IBOutlet var valueSource: [MultipleIntBoundSource]!
private var allFieldsCount: Int {
var sum = 0
valueSource.forEach { sum += $0.count }
return sum
}
ネストされたパラメータにこれを使用しました
私にとっては、プロパティを使用してこのようなものでした
let blueKills = match.blueTeam.participants.reduce(0, { (result, participant) -> Int in
result + participant.kills
})
スウィフト3
ここに表示されるすべてのオプションから、これは私のために働いたものです。
let arr = [6,1,2,3,4,10,11]
var sumedArr = arr.reduce(0, { ($0 + $1)})
print(sumedArr)
オブジェクトの配列の要素の合計
self.rankDataModelArray.flatMap{$0.count}.reduce(0, +)
これが私のアプローチです。しかし、私は最良の解決策はユーザーユーザー名tbdからの答えであると信じています
var i = 0
var sum = 0
let example = 0
for elements in multiples{
i = i + 1
sum = multiples[ (i- 1)]
example = sum + example
}
let totalSum = self.cheques.reduce(0) { $0 + $1.amount}