私は最初のアプリのチュートリアル(Swiftの学習)を進めています: http://www.appcoda.com/search-bar-tutorial-ios7/
私はこの部分に固執しています(Objective-Cコード):
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"name contains[c] %@", searchText];
searchResults = [recipes filteredArrayUsingPredicate:resultPredicate];
}
SwiftでNSPredicateの同等物を作成する方法をアドバイスできますか?
これは実際には単なる構文スイッチです。 OK、だからこのメソッド呼び出しがあります:
[NSPredicate predicateWithFormat:@"name contains[c] %@", searchText];
Swiftでは、コンストラクターは「blahWith…」の部分をスキップし、クラス名を関数として使用してから引数に直接進むため、[NSPredicate predicateWithFormat: …]
はNSPredicate(format: …)
になります。 (別の例では、[NSArray arrayWithObject: …]
はNSArray(object: …)
になります。これはSwiftの通常のパターンです。)
したがって、コンストラクタに引数を渡すだけです。 Objective-Cでは、NSStringリテラルは@""
のように見えますが、Swiftでは文字列に引用符を使用しています。したがって、次のことがわかります。
let resultPredicate = NSPredicate(format: "name contains[c] %@", searchText)
実際、それがまさにここで必要なものです。
(ちなみに、代わりに"name contains[c] \(searchText)"
のようなフォーマット文字列を使用する他の回答がいくつかあります。これは正しくありません。これは文字列補間を使用します。
かなり長い間、述語を操作します。これが私の結論です(Swift)
//Customizable! (for me was just important if at least one)
request.fetchLimit = 1
//IF IS EQUAL
//1 OBJECT
request.predicate = NSPredicate(format: "name = %@", txtFieldName.text)
//ARRAY
request.predicate = NSPredicate(format: "name = %@ AND nickName = %@", argumentArray: [name, nickname])
// IF CONTAINS
//1 OBJECT
request.predicate = NSPredicate(format: "name contains[c] %@", txtFieldName.text)
//ARRAY
request.predicate = NSPredicate(format: "name contains[c] %@ AND nickName contains[c] %@", argumentArray: [name, nickname])
Swift 2.0での使用例
let dataSource = [
"Domain CheckService",
"IMEI check",
"Compliant about service provider",
"Compliant about TRA",
"Enquires",
"Suggestion",
"SMS Spam",
"Poor Coverage",
"Help Salim"
]
let searchString = "Enq"
let predicate = NSPredicate(format: "SELF contains %@", searchString)
let searchDataSource = dataSource.filter { predicate.evaluateWithObject($0) }
あなたは(遊び場)を取得します
Objective-Cのような述語を使用する代わりに、Swiftで使用可能なフィルターを使用して、配列からコンテンツをフィルターできます。
Swift 4.0の例は次のとおりです。
var stringArray = ["foundation","coredata","coregraphics"]
stringArray = stringArray.filter { $0.contains("core") }
上記の例では、配列の各要素は文字列であるため、contains
メソッドを使用して配列をフィルタリングできます。
配列にカスタムオブジェクトが含まれる場合、そのオブジェクトのプロパティを使用して、同様に要素をフィルタリングできます。
以下のコードを使用します。
func filterContentForSearchText(searchText:NSString, scopes scope:NSString)
{
//var searchText = ""
var resultPredicate : NSPredicate = NSPredicate(format: "name contains[c]\(searchText)", nil)
//var recipes : NSArray = NSArray()
var searchResults = recipes.filteredArrayUsingPredicate(resultPredicate)
}
私はこれがSwiftでそれを行うためのより良い方法になると思います:
func filterContentForSearchText(searchText:NSString, scope:NSString)
{
searchResults = recipes.filter { name.rangeOfString(searchText) != nil }
}
Swift 2.2で
func filterContentForSearchText(searchText: String, scope: String) {
var resultPredicate = NSPredicate(format: "name contains[c] %@", searchText)
searchResults = (recipes as NSArray).filteredArrayUsingPredicate(resultPredicate)
}
Swift 3.0の場合
func filterContent(forSearchText searchText: String, scope: String) {
var resultPredicate = NSPredicate(format: "name contains[c] %@", searchText)
searchResults = recipes.filtered(using: resultPredicate)
}
//配列データに従って「名前」と「値」を変更します。
//配列(NSArray)に従って「yourDataArrayName」の名前を変更します。
let resultPredicate = NSPredicate(format: "SELF.name contains[c] %@", "value")
if let sortedDta = yourDataArrayName.filtered(using: resultPredicate) as? NSArray {
//enter code here.
print(sortedDta)
}