[ios] Swift에서 술어 사용

첫 번째 앱에 대한 자습서 (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)
    }