배열에서 개체를 찾으시겠습니까?
Swift에 _.find in Underscore.js와 같은 것이 있습니까?
나는 일련의 유형의 구조를 가지고 있습니다.T
그리고 배열에 다음과 같은 구조 객체가 포함되어 있는지 확인하고 싶습니다.name
속성은 다음과 같습니다.Foo
.
사용하려고 했습니다.find()
그리고.filter()
하지만 그들은 오직 원시적인 유형, 예를 들어.String
또는Int
다음을 준수하지 않는 오류를 발생시킵니다.Equitable
프로토콜 같은 것.
스위프트 5
요소가 있는지 확인합니다.
if array.contains(where: {$0.name == "foo"}) {
// it exists, do something
} else {
//item could not be found
}
요소 가져오기
if let foo = array.first(where: {$0.name == "foo"}) {
// do something with foo
} else {
// item could not be found
}
요소 및 해당 간격띄우기를 가져옵니다.
if let foo = array.enumerated().first(where: {$0.element.name == "foo"}) {
// do something with foo.offset and foo.element
} else {
// item could not be found
}
오프셋 가져오기
if let fooOffset = array.firstIndex(where: {$0.name == "foo"}) {
// do something with fooOffset
} else {
// item could not be found
}
사용할 수 있습니다.index
사용 가능한 방법Array
술어를 사용한 경우(여기서 Apple 설명서 참조).
func index(where predicate: (Element) throws -> Bool) rethrows -> Int?
구체적인 예는 다음과 같습니다.
스위프트 5.0
if let i = array.firstIndex(where: { $0.name == "Foo" }) {
return array[i]
}
스위프트 3.0
if let i = array.index(where: { $0.name == Foo }) {
return array[i]
}
스위프트 2.0
if let i = array.indexOf({ $0.name == Foo }) {
return array[i]
}
FWIW, 사용자 지정 기능이나 확장 기능을 사용하지 않으려면 다음을 수행할 수 있습니다.
let array = [ .... ]
if let found = find(array.map({ $0.name }), "Foo") {
let obj = array[found]
}
이는 생성됩니다.name
먼저 배열한 다음find
그것으로부터.
대규모 어레이를 사용하는 경우 다음 작업을 수행할 수 있습니다.
if let found = find(lazy(array).map({ $0.name }), "Foo") {
let obj = array[found]
}
또는 아마도:
if let found = find(lazy(array).map({ $0.name == "Foo" }), true) {
let obj = array[found]
}
스위프트 3
개체가 필요한 경우 다음을 사용합니다.
array.first{$0.name == "Foo"}
("Foo"라는 이름의 개체가 두 개 이상 있는 경우first
지정되지 않은 주문에서 첫 번째 개체를 반환합니다.)
배열에서 속성이 있는 개체 찾기에 표시된 대로 배열을 필터링한 다음 첫 번째 요소를 선택할 수 있습니다.
또는 사용자 정의 확장을 정의합니다.
extension Array {
// Returns the first element satisfying the predicate, or `nil`
// if there is no matching element.
func findFirstMatching<L : BooleanType>(predicate: T -> L) -> T? {
for item in self {
if predicate(item) {
return item // found
}
}
return nil // not found
}
}
사용 예:
struct T {
var name : String
}
let array = [T(name: "bar"), T(name: "baz"), T(name: "foo")]
if let item = array.findFirstMatching( { $0.name == "foo" } ) {
// item is the first matching array element
} else {
// not found
}
스위프트 3에서는 기존의first(where:)
방법(댓글에 언급된 대로):
if let item = array.first(where: { $0.name == "foo" }) {
// item is the first matching array element
} else {
// not found
}
스위프트 3.0
if let index = array.index(where: { $0.name == "Foo" }) {
return array[index]
}
스위프트 2.1
이제 swift 2.1에서 개체 속성 필터링이 지원됩니다.다음은 구조자 클래스의 값을 기준으로 배열을 필터링할 수 있는 예입니다.
for myObj in myObjList where myObj.name == "foo" {
//object with name is foo
}
OR
for myObj in myObjList where myObj.Id > 10 {
//objects with Id is greater than 10
}
스위프트 4,
필터 기능을 사용하여 이를 달성하는 또 다른 방법은,
if let object = elements.filter({ $0.title == "title" }).first {
print("found")
} else {
print("not found")
}
스위프트 3
Swift 3에서 인덱스(위치:)를 사용할 수 있습니다.
func index(where predicate: @noescape Element throws -> Bool) rethrows -> Int?
예
if let i = theArray.index(where: {$0.name == "Foo"}) {
return theArray[i]
}
스위프트 2 이상
결합할 수 있습니다.indexOf
그리고.map
한 줄로 "요소 찾기" 함수를 작성합니다.
let array = [T(name: "foo"), T(name: "Foo"), T(name: "FOO")]
let foundValue = array.indexOf { $0.name == "Foo" }.map { array[$0] }
print(foundValue) // Prints "T(name: "Foo")"
사용.filter
+first
더 깨끗해 보이지만,filter
배열의 모든 요소를 평가합니다. indexOf
+map
복잡해 보이지만 배열에서 첫 번째 일치 항목이 발견되면 평가가 중지됩니다.두 가지 접근법 모두 장단점이 있습니다.
array.index(of: Any)에 액세스하는 또 다른 방법은 개체를 선언하는 것입니다.
import Foundation
class Model: NSObject { }
스위프트 3
if yourArray.contains(item) {
//item found, do what you want
}
else{
//item not found
yourArray.append(item)
}
사용하다contains
:
var yourItem:YourType!
if contains(yourArray, item){
yourItem = item
}
아니면 마틴이 당신을 가리킨 것을 댓글로 시도해 볼 수도 있고,filter
다른 시도: 배열에서 속성이 있는 개체 찾기.
스위프트 3:
내장된 스위프트 기능을 사용하여 배열에서 사용자 지정 개체를 찾을 수 있습니다.
먼저 사용자 지정 개체가 동등한 프로토콜을 준수하는지 확인해야 합니다.
class Person : Equatable { //<--- Add Equatable protocol
let name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
//Add Equatable functionality:
static func == (lhs: Person, rhs: Person) -> Bool {
return (lhs.name == rhs.name)
}
}
개체에 동등한 기능이 추가되면 Swift가 배열에서 사용할 수 있는 추가 속성을 표시합니다.
//create new array and populate with objects:
let p1 = Person(name: "Paul", age: 20)
let p2 = Person(name: "Mike", age: 22)
let p3 = Person(name: "Jane", age: 33)
var people = [Person]([p1,p2,p3])
//find index by object:
let index = people.index(of: p2)! //finds Index of Mike
//remove item by index:
people.remove(at: index) //removes Mike from array
스위프트 3의 경우,
let index = array.index(where: {$0.name == "foo"})
Swift의 경우 Lo-Dash 또는 Underscore.js인 달러를 사용합니다.
import Dollar
let found = $.find(array) { $0.name == "Foo" }
예를 들어, 숫자 배열이 있는 경우:
let numbers = [2, 4, 6, 8, 9, 10]
다음과 같은 첫 번째 홀수를 찾을 수 있습니다.
let firstOdd = numbers.index { $0 % 2 == 1 }
첫 번째 홀수(9)가 인덱스 4에 있기 때문에 4를 선택적 정수로 반환합니다.
언급URL : https://stackoverflow.com/questions/28727845/find-an-object-in-array
'programing' 카테고리의 다른 글
ViewPager 및 fragments - fragment의 상태를 저장하는 올바른 방법은 무엇입니까? (0) | 2023.06.04 |
---|---|
푸시 알림에 의해 실행될 때 앱 디버깅 (0) | 2023.06.04 |
.NET에 UI 독립적인 Point 구조가 있습니까? (0) | 2023.06.04 |
잘못된 상태 예외:ViewPager를 사용하여 인스턴스 상태 저장 후 이 작업을 수행할 수 없습니다. (0) | 2023.06.04 |
파일 변환:Android에서 파일에 대한 URI (0) | 2023.06.04 |