답변:
이것은 내가 찾을 수있는 가장 쉬운 방법입니다.
스위프트 3과 스위프트 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가 롤링하는 방식이기 때문에 단일 더하기 부호로 단순화 할 수 있습니다.
combine
. 이어야 multiples.reduce(0, combine: +)
합니다.
flatMap
먼저 그것을 사용하여 단일 차원 배열로 평면화하십시오. multiArray.flatMap{$0}.reduce(0, combine: +)
Swift3가 다음으로 변경되었습니다.
let multiples = [...]
sum = multiples.reduce(0, +)
에서 스위프트 4 당신은 또한에 시퀀스 요소를 제한 할 수 숫자의 다음과 같은 순서로 모든 요소의 합을 반환하는 프로토콜을
extension Sequence where Element: Numeric {
/// Returns the sum of all elements in the collection
func sum() -> Element { return reduce(0, +) }
}
편집 / 업데이트 :
Xcode 10.2 • 스위프트 5 이상
시퀀스 요소를 새로운 AdditiveArithmetic 프로토콜로 제한 하여 컬렉션의 모든 요소의 합을 반환 할 수 있습니다.
extension Sequence where Element: AdditiveArithmetic {
func sum() -> Element {
return reduce(.zero, +)
}
}
Xcode 11 • 스위프트 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
짧은 형식에도 불구하고 여러 번 고전적인주기를 선호 할 수 있습니다.
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 }
비록 내가 reduce를 사용할 것이지만.
가능한 해결책 : 접두사 연산자를 정의하십시오. APL에서와 같이 "+ /"축소 연산자처럼 (예 : GNU APL)
여기에 약간 다른 접근 방식이 있습니다.
프로토콜 en 제네릭 형식을 사용하면 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
(Xcode 버전 7.3에서 테스트 된 Swift 2.2 용으로 업데이트 됨)
스위프트 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 })
이것은 나를 위해 작동합니다.
스위프트 3
여기에 표시된 모든 옵션 중에서 이것은 나를 위해 일한 것입니다.
let arr = [6,1,2,3,4,10,11]
var sumedArr = arr.reduce(0, { ($0 + $1)})
print(sumedArr)
이것이 이것에 대한 나의 접근 방식입니다. 그러나 가장 좋은 해결책은 사용자 사용자 이름 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}