2017-09-12 12 views
1

入力された文字列が配列内のどの項目にも一致するかどうかを評価しようとしています。私が遊び場で次の方法を使うと、正しく動作するようです。しかし、私がXcode 9.0 beta 6(9M214v)でまったく同じメソッドを使用すると、正しい答えが返されません。配列に文字列が含まれているかどうかを調べる

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

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

https://twitter.com」に合格したときのような異常もあります。私はナッツですか?私がここにいる間、誰もがこの問題を解決するために異なるアプローチをしていますか?

+3

'$ 0 <= item'それはどういう意味ですか? –

+0

@MikeAlterがコメントしたように、 '$ 0 <= item'のように比較するロジックは何ですか? –

+0

あなたはそれが遊び場で機能すると述べています。どのバージョン? Swift 3ではこれが実際に動作するのですが、Swift 4では動作しませんか?どうか明らかにしてください。 – rmaddy

答えて

2

theresのも、それはtrueを返します のような異常検知。スウィフトのバージョンがあなたのコードに基づいて、3または4であるかどうか

あなたは同じtrue結果を取得する必要がありますスニペット!どうして?

比較を行うためのcontains(where:)の論理が与えられた要素の平等のロジックに関連しているので、私は、あなたが非equatable要素の配列でcontainsを使用することはできません電子。それをより明確にするために:

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

結果はtrueのためのすべての文になります( 'T' の文字が 'A'、 'F' と 'S' よりも大きくなります)。したがって

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

だろう戻るfalse( 't' は 'Z' 未満です)。

しかし、期待される結果を得るために、あなたはこのようなあなたの機能を実現することができます。

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

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

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

かのためにさらに短くcontains:リード

return whitelist.contains(item) 

ができるように

isValid("https://twitter.com") 

falseを返します。

+0

"https://"のように、最後の要素(文字)に達するまで、文字列の次の文字をチェックする必要があります。一致した場合は等価になります。 –

+0

これは、各文字が<=同じ位置にある文字かどうかを評価することです。私は各項目を文字の配列ではなく1つの文字列として評価していたという印象を受けました。 私がしようとしているのは、特定のURLのスキームとホストが配列に一致するかどうかです。 'contains'だけを使うとURLの残りの部分を考慮せず、最初の部分が配列にあっても' false'を返します。 – SirCJ

+0

これはまったく別のケースです:)あなたは 'URL'と' URLComponenets'を使ってそれを達成する必要があります。私は自分の答えを更新できますが、あなたの質問のタイトルと無関係です... –

0

だけtrueまたはfalseを返します。これは、以下を返す:私は "https://twitter.com" に渡されたとき

return whitelist.contains(item) 
関連する問題