Swift에서 술어 사용


93

첫 번째 앱에 대한 자습서 (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에 해당하는 것을 만드는 방법을 조언 할 수 있습니까?

답변:


158

이것은 실제로 구문 전환 일뿐입니다. 자,이 메서드 호출이 있습니다.

[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)". 와 같은 형식 문자열을 사용하는 것을 알 수 있습니다. 맞지 않습니다. 이는 조건 자 형식과 다르며 일반적으로 작동하지 않는 문자열 보간을 사용합니다.)


감사. 날 구해줘!
Hugo

2
메서드의 두 번째 줄을 처리하려면 조건자를 다음과 같이 사용할 수 있습니다.searchResults = recipes.filter { resultPredicate.evaluateWithObject($0) }
Ben Packard

43

꽤 오랜 시간 동안 술어로 작업합니다. 내 결론은 다음과 같습니다 (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])

1
무엇이 같 LIKE 'a%z'습니까?
TomSawyer

@ Jiří Zahálka 요청 듣고 의미는 무엇입니까?
Muju

28

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) }

당신은 얻을 것입니다 (놀이터)

여기에 이미지 설명 입력


만약 ... 사전이 여러 개 있다면? 데이터를 얻기 위해 어떻게 구문 분석합니까?
Revathy Durairajan

1
@RevathyDurairajan 사전 배열을 필터링하려면 SELF.yourkeyname이 필요합니다.
Pawan Rai

11

Objective-C에서와 같은 조건자를 사용하는 대신 신속하게 사용할 수있는 필터를 사용하여 배열에서 콘텐츠를 필터링 할 수 있습니다.

Swift 4.0의 예는 다음과 같습니다.

var stringArray = ["foundation","coredata","coregraphics"]
stringArray = stringArray.filter { $0.contains("core") }

위의 예에서 배열의 각 요소는 문자열이므로이 contains메서드를 사용 하여 배열을 필터링 할 수 있습니다 .

배열에 사용자 지정 개체가 포함 된 경우 해당 개체의 속성을 사용하여 요소를 유사하게 필터링 할 수 있습니다.


6

아래 코드를 사용하십시오.

 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)
}

1
어떤 이유로 그렇게 작성하는 것이 저에게 효과가 없었지만 let myPredicateString = "name contains [c] (searchText)"를 한 다음 var resultPredicate : NSPredicate = NSPredicate (format : myPredicateString)를 수행했습니다
AppHandwerker 2014

5

나는 이것이 Swift에서 더 나은 방법이라고 생각합니다.

func filterContentForSearchText(searchText:NSString, scope:NSString)
{
   searchResults = recipes.filter { name.rangeOfString(searchText) != nil  }
}

1
을 필터링하는 경우 더 관용적 Sequence이지만을 NSPredicate처리 할 때와 같이를 필요로하는 경우가 있습니다 NSFetchedResultsController.
Jarsen

1

신속한 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)
    }

1

// 배열 데이터에 따라 "이름"과 "값"을 변경합니다.

// 배열 (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)
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.