첫 번째 앱에 대한 자습서 (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에 해당하는 것을 만드는 방법을 조언 할 수 있습니까?
답변
이것은 실제로 구문 전환 일뿐입니다. 자,이 메서드 호출이 있습니다.
[NSPredicate predicateWithFormat:@"name contains[c] %@", searchText];
스위프트에서 생성자는 “blahWith …”부분을 건너 뛰고 함수로 클래스 이름을 사용하고 인수로 바로 이동, 그렇게 [NSPredicate predicateWithFormat: …]
될 것입니다 NSPredicate(format: …)
. (또 다른 예를 들어, [NSArray arrayWithObject: …]
될 것입니다 NSArray(object: …)
. 이것은 스위프트의 규칙적인 패턴입니다.)
이제 생성자에게 인자를 전달하기 만하면됩니다. 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 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 }
}
답변
신속한 2.2
func filterContentForSearchText(searchText: String, scope: String) {
var resultPredicate = NSPredicate(format: "name contains[c] %@", searchText)
searchResults = (recipes as NSArray).filteredArrayUsingPredicate(resultPredicate)
}
신속한 3.0
func filterContent(forSearchText searchText: String, scope: String) {
var resultPredicate = NSPredicate(format: "name contains[c] %@", searchText)
searchResults = recipes.filtered(using: resultPredicate)
}