Có cách nào để làm điều gì đó tương tự như break
từ vòng lặp for
nhưng trong hàm reduce()
của mảng không?Có cách nào để thoát khỏi chức năng giảm của mảng trong Swift không?
Ví dụ: hãy xem xét tôi có một mảng:
var flags = [false, false, true, false, false, true, false]
... và tôi cần phải tích lũy ||
trên chúng. Với một vòng lặp for
, sau đây sẽ có thể:
var resultByFor = false
for flag in flags {
if flag {
resultByFor = true
break
}
}
... ví dụ: tại thời điểm này chúng tôi nhận đầu tiên true
không có nhu cầu để kết thúc vòng lặp như kết quả sẽ là true
nào của chúng tôi.
Với reduce()
, sau đây trông khá gọn gàng và ngăn nắp:
var resultByReduce = flags.reduce(false) { $0 || $1 }
Tuy nhiên, với những mảng được đưa ra trong ví dụ này, cơ thể for
vòng lặp sẽ được thực thi chỉ có 3 lần, trong khi reduce()
chức năng đóng cửa sẽ được kích hoạt đầy 7 lần.
Có cách nào để thực hiện reduce()
để bảo lãnh cho lần lặp thứ 3 không (giống như nó có thể được thực hiện trong vòng lặp for
)?
[UPD]
tôi quá đơn giản hóa các câu hỏi. Vấn đề ban đầu là như thế này:
extension Int {
func isWholeMultiplesOf(base: Int) -> Bool {
return (self % base) == 0
}
}
var numbers = [3, 5, 6, 7, 2, 3, 8]
var resultByFor = false
// The loop body will be triggered only 3 times
for number in numbers {
if number.isWholeMultiplesOf(2) {
resultByFor = true
break
}
}
// The closure of reduce() will be triggered 7 times
var resultByReduce = numbers.reduce(false) {
$0 || $1.isWholeMultiplesOf(2)
}
... ví dụ: Tôi có một mảng các đối tượng và tôi muốn biết nếu có ít nhất một trong số họ có phương pháp nào đó đánh giá để true
.
Tôi không nghĩ như vậy. 'reduce' như' contains' và 'filter' lặp lại trên tất cả các mục. Tôi nghĩ rằng ví dụ đầu tiên là một ví dụ thích hợp –
bạn có thể viết đó là phần mở rộng. Điều đó sẽ giống như giảm nhưng phá vỡ sớm. –
Tại sao bạn không sử dụng chỉ chứa? – Fogmeister