2015-05-28 7 views

risposta

20

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) 
} 
+0

boolArray memorizza un oggetto anziché valore booleano puro. – DNB5brims

+0

Sapete se c'è una differenza di prestazioni tra questo e l'utilizzo del ciclo? –

+0

Dipenderà dalla dimensione dell'array e dalla posizione dei primi elemen che si stanno cercando nell'array –

-4

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 
1

Un modo semplice per farlo è usare un predicato :

let notAllTrue = contains(array) { 
    item in item.isTrue == false 
} 
+2

lasciare allTrue =! Contiene (boolArray) { elemento in! Item.isTrue } –

+0

@LeonardoSavioDabus: meno didattico, ma più programmabile (ma comunque troppo molti! s) –

+0

Puoi anche usare un argomento implicito '{! $ 0.isTrue}' – Alexander

-1

Prova a fare questo -

println((boolArr.filter {!($0 as! MyObject).isTrue}).count) 
+1

@LeonardoSavioDabus ha solo chiesto se c'era una scorciatoia per farlo, leggi la sua domanda. – kabiroberai

+0

Invece di eseguire il ciclo uno alla volta, –

+0

@LeonardoSavioDabus, ha detto che passa attraverso l'intero ** array ** – kabiroberai

7

Un modo puramente funzionale utilizzando reduce funzione:

let boolArray = [true,true,true,true] 
let isAllTrue = boolArray.reduce(true, combine: {$0 && $1}) // true 
+5

Ricorda: questo non è un cortocircuito. Un falso potrebbe essere trovato sul primo oggetto, ma procederà comunque a passare attraverso l'intero elenco. – Alexander

+0

Questo è corretto, grazie per averlo indicato. Pertanto, l'uso su array di grandi dimensioni è scoraggiato. – zvonicek

+0

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