Swift에서 술어 사용
저는 제 첫 번째 앱을 위해 여기서 (스위프트 학습) 튜토리얼을 진행하고 있습니다: http://www.appcoda.com/search-bar-tutorial-ios7/
이 부분(객체-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];
Swift에서 생성자는 "blahWith..." 부분을 건너뛰고 클래스 이름을 함수로 사용한 다음 인수로 바로 이동합니다.[NSPredicate predicateWithFormat: …]
될 것입니다NSPredicate(format: …)
(다른 예를 들어,[NSArray arrayWithObject: …]
될 것입니다NSArray(object: …)
이것은 Swift의 일반적인 패턴입니다.)
이제 우리는 그 주장을 건설자에게 전달하기만 하면 됩니다.목표-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) }
(운동장)을 얻게 될 것입니다.
목표-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)
}
배열 데이터에 따라 "이름" 및 "값"을 변경합니다.
어레이(NSarray)에 따라 "your DataArrayName" 이름을 변경합니다.
let resultPredicate = NSPredicate(format: "SELF.name contains[c] %@", "value")
if let sortedDta = yourDataArrayName.filtered(using: resultPredicate) as? NSArray {
//enter code here.
print(sortedDta)
}
언급URL : https://stackoverflow.com/questions/24176605/using-predicate-in-swift
'source' 카테고리의 다른 글
Nodemon으로 시작 스크립트를 실행하는 방법 (0) | 2023.08.25 |
---|---|
기본값 롤백 방법 Git (0) | 2023.08.20 |
문자열 유형으로 buildConfigField를 생성하는 방법 (0) | 2023.08.20 |
PyCharm, PHPStorm 또는 RubyMine과 같은 IntelliJ IDEA IDE에서 Powershell을 터미널로 사용 (0) | 2023.08.20 |
div에 오버플로 요소가 있는지 jquery로 확인합니다. (0) | 2023.08.20 |