Solo se è possibile avere una matrice di oggetti MyObject
, e la MyObject
ha ottenuto una variabile denominata isTrue
, eccetto dal loop dell'intero array per controllare se tutto l'oggetto in quell'array è vero, è che qualsiasi breve mano da eseguire così? Grazie.E 'possibile verificare tutto il valore in swift array è vero invece di eseguire il ciclo uno alla volta?
risposta
aggiornamento: Xcode 8.2 • Swift 3.0.2
È possibile utilizzare per verificare se contiene non contiene falso come segue:
let boolsArray = [true,true,true,true]
if !boolsArray.contains(false) {
print(true)
}
class MyObject {
let isTrue: Bool
required init(_ isTrue: Bool) {
self.isTrue = isTrue
}
}
let myObj1 = MyObject(true)
let myObj2 = MyObject(true)
let myObj3 = MyObject(true)
let objects = [myObj1,myObj2,myObj3]
if !objects.contains{!$0.isTrue} {
print(true)
}
Se si dispone di una classe definita come tale:
class Obj {
var isTrue: Bool
init(isTrue: Bool)
{
self.isTrue = isTrue
}
}
e una serie definita come tale:
let array = [Obj(isTrue: true), Obj(isTrue: false), Obj(isTrue: true)]
allora si potrebbe usare queste abbreviazioni per rilevare se ci sono falsi valori nei campi IsTrue:
array.filter{!$0.isTrue}.count > 0
Un modo semplice per farlo è usare un predicato :
let notAllTrue = contains(array) {
item in item.isTrue == false
}
lasciare allTrue =! Contiene (boolArray) { elemento in! Item.isTrue } –
@LeonardoSavioDabus: meno didattico, ma più programmabile (ma comunque troppo molti! s) –
Puoi anche usare un argomento implicito '{! $ 0.isTrue}' – Alexander
Prova a fare questo -
println((boolArr.filter {!($0 as! MyObject).isTrue}).count)
@LeonardoSavioDabus ha solo chiesto se c'era una scorciatoia per farlo, leggi la sua domanda. – kabiroberai
Invece di eseguire il ciclo uno alla volta, –
@LeonardoSavioDabus, ha detto che passa attraverso l'intero ** array ** – kabiroberai
Un modo puramente funzionale utilizzando reduce
funzione:
let boolArray = [true,true,true,true]
let isAllTrue = boolArray.reduce(true, combine: {$0 && $1}) // true
Ricorda: questo non è un cortocircuito. Un falso potrebbe essere trovato sul primo oggetto, ma procederà comunque a passare attraverso l'intero elenco. – Alexander
Questo è corretto, grazie per averlo indicato. Pertanto, l'uso su array di grandi dimensioni è scoraggiato. – zvonicek
C'è un modo per fare questo cortocircuito funzionalmente e ancora? Questo mi sembra un approccio migliore rispetto alla risposta selezionata perché è più generalizzabile (cioè cosa fare se si desidera verificare se tutti i valori sono uguali a '2'?) – Kevin
boolArray memorizza un oggetto anziché valore booleano puro. – DNB5brims
Sapete se c'è una differenza di prestazioni tra questo e l'utilizzo del ciclo? –
Dipenderà dalla dimensione dell'array e dalla posizione dei primi elemen che si stanno cercando nell'array –