2017-09-12 17 views
1

Ich versuche zu bewerten, ob eine eingegebene Zeichenfolge teilweise mit einem Element in einem Array übereinstimmt. Wenn ich die folgende Methode auf Spielplätzen verwende, scheint es richtig zu funktionieren. Wenn ich jedoch dieselbe Methode in Xcode 9.0 Beta 6 (9M214v) verwende, gibt es nicht die richtige Antwort zurück.Überprüfen, ob ein Array eine Zeichenfolge enthält

func isValid(_ item: String) -> Bool { 
    let whitelist = ["https://apple.com","https://facebook.com","https://stackoverflow.com"] 

    return whitelist.contains(where: {$0 <= item ? true : false }) 
} 

Es auch ist Anomalien wie wenn ich in „https://twitter.com“ bestanden wird es wahr zurück. Bin ich verrückt? Und während ich hier bin, hat jeder einen anderen Ansatz, um dieses Problem zu lösen?

+3

'$ 0 <= item' was bedeutet das? –

+0

Wie @MikeAlter kommentierte, wie lautet die Logik des Vergleichens von "$ 0 <= item"? –

+0

Sie sagen, es funktioniert auf Spielplätzen. Welche Version? Meinst du eigentlich, das funktioniert in Swift 3, aber nicht in Swift 4? Bitte klären Sie. – rmaddy

Antwort

2

Theres Anomalien auch wie wenn ich bestehen in "https://twitter.com" es wahr zurückkehren werde.

Ob die Version von Swift 3 oder 4 ist, basierend auf dem Code-Schnipsel Sie das gleichetrue Ergebnis bekommen sollen! Warum?

weil die Logik der contains(where:) des Vergleichs tun, um die Logik der Gleichheit der gegebenen Elemente bezieht, i, e Sie nicht contains mit Array von nicht-gleichzusetzen Elemente verwenden können. Um es klar:

"https://apple.com" <= "https://twitter.com" 
"https://facebook.com" <= "https://twitter.com" 
"https://stackoverflow.com" <= "https://twitter.com" 

das Ergebnis wäre true für alle Aussagen ('t' Zeichen größer als 'a', 'f' und 's').

So:

"https://zwebsite" <= "https://twitter.com" 

würde kehrt false ('t' kleiner als 'z').

jedoch das erwartete Ergebnis zu erhalten, könnten Sie Ihre Funktion wie folgt implementieren:

func isValid(_ item: String) -> Bool { 

    let whitelist = ["https://apple.com","https://facebook.com","https://stackoverflow.com"] 

    return whitelist.contains { $0 == item } 
} 

Oder sogar eine kürzere contains:

return whitelist.contains(item) 

Welche

isValid("https://twitter.com") 
zu lassen führt

zurückgeben false.

+0

Es sollte das nächste Zeichen in der Zeichenfolge, wie im Fall von "https: //", bis zum letzten Element (Zeichen) überprüfen, wenn alle übereinstimmen, dann wird es eine Gleichheit sein. –

+0

Also was passiert ist, dass es bewertet, ob jedes Zeichen <= das Zeichen in der gleichen Position ist. Ich hatte den Eindruck, dass es jedes Element als eine Zeichenfolge und nicht als eine Reihe von Zeichen bewertete. Was ich versuche zu tun ist zu sehen, ob das Schema & Host einer bestimmten URL mit einem im Array übereinstimmt. Wenn nur 'contains' verwendet wird, wird der Rest der URL nicht berücksichtigt und es wird' false' zurückgegeben, auch wenn der erste Teil im Array ist. – SirCJ

+0

Nun, das wäre ein ganz anderer Fall :) Sie sollten mit "URL" und "URLComponenets" arbeiten, um es zu erreichen, ich könnte meine Antwort aktualisieren, aber es wird nicht mit dem Titel Ihrer Frage in Verbindung stehen ... –

0

einfach die folgende Rückkehr, die true oder false zurück:

return whitelist.contains(item) 
Verwandte Themen