質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

1810閲覧

swift NSPredicateの引数について

L85A2

総合スコア60

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2018/08/24 07:07

swiftを勉強中です。

以下のサイトに記述されているコードが理解できません。

https://qiita.com/H_Crane/items/e784a5f7c4fb5e6470e6

【日本語判定】の項目にて

swift

1NSPredicate(format: "SELF MATCHES %@", range).evaluate(with: self)

NSPredicateの公式リファレンスを読んでも内容が理解できませんでしたので誰か解説をお願いします。
特に引数である"SELF MATCHES %@"の意味がわかりません。

よろしくお願いします。

公式リファレンス NSPredicate
https://developer.apple.com/documentation/foundation/nspredicate

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

特に引数である"SELF MATCHES %@"の意味がわかりません。

SELF(selfを渡しているのでString自身)が%@(引数のrangeが割り当てられる)とMATCHES(一致)するかどうか。

日本語ドキュメントより、

MATCHES演算子は、次の例に示すようにICUの正規表現パッケージを使用します。

ということなので、rangeが表す正規表現とself(String自身)が一致するかどうか、ということになります。

投稿2018/08/24 07:45

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

L85A2

2018/08/24 08:03

日本語のドキュメントがあるのですね 回答ありがとうございます。
guest

0

ベストアンサー

引用されているサイト

[Swift]iOSのデフォルトの関数を活用した Validation String Extension集

から少しコードを抜粋しますが、

Swift

1extension String { 2 3 /// 「漢字」かどうか 4 var isKanji: Bool { 5 let range = "^[\u{3005}\u{3007}\u{303b}\u{3400}-\u{9fff}\u{f900}-\u{faff}\u{20000}-\u{2ffff}]+$" 6 return NSPredicate(format: "SELF MATCHES %@", range).evaluate(with: self) 7 } 8

この中の"SELF MATCHES %@" がどういう意味になるかというと、

まず SELF は Literals より、

SELF
Represents the object being evaluated.

つまり評価対象自身、この場合は evaluate(with: self) の self となります。
このコードは String の extension なので、 self は String です。

MATCHES は String Comparisons より、

MATCHES
The left hand expression equals the right hand expression using a regex-style comparison according to ICU v3 (for more details see the ICU User Guide for Regular Expressions).

ですから、左辺の SELF(対象文字列)が右辺の正規表現を満たすかどうかをチェックしてます。

右辺は %@ になっていますが、 Parser Basics にある通り、

The format string supports printf-style format specifiers such as %x (see Formatting String Objects). Two important format specifiers are %@ and %K.

%@ is a var arg substitution for an object value—often a string, number, or date.

printf関数のようなパラメータ展開を行います。

Swift

1NSPredicate(format: "SELF MATCHES %@", range) 2

なので %@ は range、つまり

"^[\u{3005}\u{3007}\u{303b}\u{3400}-\u{9fff}\u{f900}-\u{faff}\u{20000}-\u{2ffff}]+$"

です。

これは正規表現です。

結局、対象文字列が上記の正規表現を満たすかどうかチェックしている、ということになります。

投稿2018/08/24 07:39

daisuke7

総合スコア1563

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

L85A2

2018/08/24 08:02

丁寧な解説ありがとうございます。 Predicate Programming Guide事体知らなかったので、URLまで記述していただて助かりました。
daisuke7

2018/08/24 08:05

どういたしまして。 でも、質問に挙げていた NSPredicate のページに "For a complete syntax reference, refer to the Predicate Programming Guide." としてリンクありますよ:)
L85A2

2018/08/24 08:13

英語アレルギー直しておきますorz
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問