source

Swift에서 술어 사용

ittop 2023. 8. 20. 12:41
반응형

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

(운동장)을 얻게 될 것입니다.

enter image description here

목표-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

반응형