Objective-CのisEqualToStringに相当するSwiftとは何ですか?


271

以下のコードを実行しようとしています:

import UIKit

class LoginViewController: UIViewController {

@IBOutlet var username : UITextField = UITextField()
@IBOutlet var password : UITextField = UITextField()

@IBAction func loginButton(sender : AnyObject) {

    if username .isEqual("") || password.isEqual(""))
    {
        println("Sign in failed. Empty character")
    }
}

私の以前のコードはObjective-Cにありましたが、うまく機能していました:

 if([[self.username text] isEqualToString: @""] ||
    [[self.password text] isEqualToString: @""] ) {

isEqualToStringSwift では使えないと思います。任意の助けいただければ幸いです。

回答:


428

Swiftを使用すると、同等性をチェックする必要はもうありません isEqualToString

これで使用できます ==

例:

let x = "hello"
let y = "hello"
let isEqual = (x == y)

今isEqual is trueです。


37
===は同一性演算子==ですが、等値演算子です(デフォルトisEqual:ではNSObjectとそのサブクラスの呼び出し)
Bryan Chen

3
はい、申し訳ありませんが、アイデンティティではなく「平等」です。間違った言葉:)
JJSaccolo

1
しかし、私が何かを見落とさない限り、あなたは文字列間のアイデンティティをテストすることができないようです:'String' does not conform to protocol 'AnyObject'

3
@ user1040049 ===演算子を使用して文字列を比較することはできません。swiftの文字列は、クラスではなく構造体型であるためです。入力したテキスト/文字列をNSStringとしてキャストすると、===演算子を使用して比較できます。
sanjana

3
@JJSaccoloあなたはアイデンティティの部分で本当に誤解を招きます。String比較についてのこの質問。Xcode 6.4はエラーを返しますBinary operator '===' cannot be applied to two String operands
Dima Deplov

47

代わりに==演算子を使用isEqual

文字列の比較

Swiftは文字列値を比較する3つの方法を提供します:文字列の等価性、プレフィックスの等価性、およびサフィックスの等価性。

文字列の等価性

2つの文字列値は、まったく同じ文字が同じ順序で含まれている場合、等しいと見なされます。

let quotation = "We're a lot alike, you and I."
let sameQuotation = "We're a lot alike, you and I."
if quotation == sameQuotation {
    println("These two strings are considered equal")
}
// prints "These two strings are considered equal"
.
.
.

詳細については、Swift (検索文字列の検索)の公式ドキュメントをご覧ください


13

それに加えて@JJSaccolo、カスタムequalsメソッドを次のような新しい文字列拡張として作成できます。

extension String {
     func isEqualToString(find: String) -> Bool {
        return String(format: self) == find
    }
}

そして使い方:

let a = "abc"
let b = "abc"

if a.isEqualToString(b) {
     println("Equals")
}

確かに元の演算子の==方が良いかもしれません(Javascriptのように動作します)が、私にとっては、isEqualメソッドは文字列を比較するいくつかのコードの明確さを提供します

それが誰かに役立つことを願って、


8

Swiftでは、==演算子はObjective CのisEqual:メソッドと同等です(ポインターを比較するのではなくisEqualメソッドを呼び出し、ポインターが同じであることをテストするための新しい===メソッドがあります)。これは:

if username == "" || password == ""
{
    println("Sign in failed. Empty character")
}

これは迅速に機能しますが、usernameがnilの場合、objcで混乱を引き起こします。上記のように、username.isEmptyを使用すると、目的cの同等のisEmptyマクロがどこかにあります。
johndpope 2015

Swiftでは、ユーザー名が文字列として宣言されていない限り?(別名Optional <String>)その場合、nilにすることはできません。Objective Cでは、([username length] == 0 || [password length] == 0){...}と指定するだけで、nilまたは空のケースをカバーできます。
Nick Lockwood、2015

6

実際、swiftは文字列をオブジェクトのように扱うのではなく、値のように扱おうとしているようです。ただし、これは内部でSwiftが文字列をオブジェクトとして処理しないことを意味するものではありません。文字列に対してメソッドを呼び出してそのプロパティを使用できることに気づいたことでしょう。

例えば:-

//example of calling method (String to Int conversion)
let intValue = ("12".toInt())
println("This is a intValue now \(intValue)")


//example of using properties (fetching uppercase value of string)
let caUpperValue = "ca".uppercaseString
println("This is the uppercase of ca \(caUpperValue)")

objectCでは、メソッドの呼び出しに加えて、変数を介して文字列オブジェクトへの参照を渡すことができます。これにより、文字列が純粋なオブジェクトであるという事実がほぼ確立されます。

Stringをオブジェクトとして見ようとするときの注意点を以下に示します。迅速に、変数を介して文字列オブジェクトを参照渡しすることはできません。Swiftは常に文字列の新しいコピーを渡します。したがって、文字列はSwiftでは値型としてより一般的に知られています。実際、2つの文字列リテラルは同一ではありません(===)。それらは2つの異なるコピーとして扱われます。

let curious = ("ca" === "ca")
println("This will be false.. and the answer is..\(curious)")

ご覧のとおり、文字列をオブジェクトとして考え、値のように扱う従来の方法から脱却し始めています。したがって、Swiftでは2つの同一の文字列オブジェクトを取得できないため、文字列オブジェクトのID演算子として扱われていた.isEqualToStringは無効になります。比較できるのはその値のみです。つまり、等価性(==)を確認します。

 let NotSoCuriousAnyMore = ("ca" == "ca")
 println("This will be true.. and the answer is..\(NotSoCuriousAnyMore)")

これは、文字列オブジェクトの可変性をすばやく見ると、さらに興味深いものになります。しかし、それは別の質問のための別の日です。あなたがおそらく調査すべき何かは、それを本当に興味深いものにします。:)いくつかの混乱が解消されることを願っています。乾杯!


4

UITextFieldのテキスト比較について、以下のコードを使用して問題なく機能しています。エラーが見つかった場合はお知らせください。

if(txtUsername.text.isEmpty || txtPassword.text.isEmpty)
{
    //Do some stuff
}
else if(txtUsername.text == "****" && txtPassword.text == "****")
{
    //Do some stuff
}

3

Swiftでは、isEmpty関数は文字列が空かどうかをチェックします。

 if username.isEmpty || password.isEmpty {
      println("Sign in failed. Empty character")
 }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.