Swiftで整数の配列の合計を見つける最も簡単な(最善の)方法は何ですか?倍数という配列があり、倍数の合計を知りたいです。
これは私が見つけることができる最も簡単な/最短の方法です。
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メソッド(documentation here )を使います。これは "与えられたクロージャを再帰的に適用することで要素のコレクションを単一の値に減らす"ことを可能にします。初期値として0を与え、そして本質的にクロージャー{ $0 + $1 }
を与えます。もちろん、これを単一のプラス記号に単純化することができます。それがSwiftがロールする方法です。
Swift 3/Swift 4オブジェクトのプロパティを合計するための1つの線形
var totalSum = scaleData.map({$0.points}).reduce(0, +)
ここでpointsは私のカスタムオブジェクトのプロパティscaleDataを減らそうとしています
Swift3は次のように変更されました。
let multiples = [...]
sum = multiples.reduce(0, +)
これも動作します:
let arr = [1,2,3,4,5,6,7,8,9,10]
var sumedArr = arr.reduce(0, combine: {$0 + $1})
print(sumedArr)
年です。55
Swift 4の例
class Employee {
var salary: Int = 0
init (_ salary: Int){
self.salary = salary
}
}
let employees = [Employee(100),Employee(300),Employee(600)]
var sumSalary = employees.reduce(0, {$0 + $1.salary}) //1000
Swift
一般的なオブジェクトの配列があり、いくつかのオブジェクトプロパティを合計したい場合は、
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-cycleを好むかもしれません:
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 =配列内の要素数
InSwift 4シーケンス内のすべての要素の合計を返すように Numeric プロトコルを拡張することもできます。
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, +)
}
}
let numbers = [1,2,3]
numbers.sum() // 6
let doubles = [1.5, 2.7, 3.0]
doubles.sum() // 7.2
考えられる解決策:それに対する接頭演算子を定義してください。 APLのように "+ /"を減らす演算子のように(例えばGNU APL)
ここでは少し異なるアプローチがあります。
汎用型のプロトコルを使用すると、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.
私は同じ問題を抱えていた、私は文書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
}
ネストしたパラメータにこれを使用しました