반응형
개체 배열에서 속성 값 배열 가져오기
라는 클래스가 있어요.Employee
.
class Employee {
var id: Int
var firstName: String
var lastName: String
var dateOfBirth: NSDate?
init(id: Int, firstName: String, lastName: String) {
self.id = id
self.firstName = firstName
self.lastName = lastName
}
}
그리고 나는 일련의Employee
물건들.내가 지금 필요한 건 그 추출물을id
를 새 어레이로 만듭니다.
저도 비슷한 질문을 발견했어요.하지만 Objective-C에 있기 때문에valueForKeyPath
할 수 있을 것 같아요.
스위프트에서 이걸 어떻게 해?
를 사용할 수 있습니다.map
특정 유형의 배열을 다른 유형의 배열로 변환하는 방법(사용자의 경우, 다음 유형의 배열에서)Employee
을 배열하다Int
:
var array = [Employee]()
array.append(Employee(id: 4, firstName: "", lastName: ""))
array.append(Employee(id: 2, firstName: "", lastName: ""))
let ids = array.map { $0.id }
Swift 5는 유사한 객체의 배열에서 속성 값 배열을 가져올 수 있는 다양한 방법을 제공합니다.필요에 따라 다음 6가지 Playground 코드 예시 중 하나를 선택하여 문제를 해결할 수 있습니다.
1. 사용방법map
방법
Swift의 경우,Sequence
프로토콜에는 메서드가 있습니다.다음 샘플 코드는 사용 방법을 보여 줍니다.
class Employee {
let id: Int, firstName: String, lastName: String
init(id: Int, firstName: String, lastName: String) {
self.id = id
self.firstName = firstName
self.lastName = lastName
}
}
let employeeArray = [
Employee(id: 1, firstName: "Jon", lastName: "Skeet"),
Employee(id: 2, firstName: "Darin", lastName: "Dimitrov"),
Employee(id: 4, firstName: "Hans", lastName: "Passant")
]
let idArray = employeeArray.map({ (employee: Employee) -> Int in
employee.id
})
// let idArray = employeeArray.map { $0.id } // also works
print(idArray) // prints [1, 2, 4]
2. 사용방법for
고리
class Employee {
let id: Int, firstName: String, lastName: String
init(id: Int, firstName: String, lastName: String) {
self.id = id
self.firstName = firstName
self.lastName = lastName
}
}
let employeeArray = [
Employee(id: 1, firstName: "Jon", lastName: "Skeet"),
Employee(id: 2, firstName: "Darin", lastName: "Dimitrov"),
Employee(id: 4, firstName: "Hans", lastName: "Passant")
]
var idArray = [Int]()
for employee in employeeArray {
idArray.append(employee.id)
}
print(idArray) // prints [1, 2, 4]
3. 사용방법while
고리
Swift와 함께, 무대 뒤에서,for
루프는 단순한while
을 반복하다.sequence
의 반복기(자세한 내용은 Iterator Protocol 참조).
class Employee {
let id: Int, firstName: String, lastName: String
init(id: Int, firstName: String, lastName: String) {
self.id = id
self.firstName = firstName
self.lastName = lastName
}
}
let employeeArray = [
Employee(id: 1, firstName: "Jon", lastName: "Skeet"),
Employee(id: 2, firstName: "Darin", lastName: "Dimitrov"),
Employee(id: 4, firstName: "Hans", lastName: "Passant")
]
var idArray = [Int]()
var iterator = employeeArray.makeIterator()
while let employee = iterator.next() {
idArray.append(employee.id)
}
print(idArray) // prints [1, 2, 4]
4. a의 사용struct
에 준거하고 있다IteratorProtocol
그리고.Sequence
프로토콜
class Employee {
let id: Int, firstName: String, lastName: String
init(id: Int, firstName: String, lastName: String) {
self.id = id
self.firstName = firstName
self.lastName = lastName
}
}
struct EmployeeSequence: Sequence, IteratorProtocol {
let employeeArray: [Employee]
private var index = 0
init(employeeArray: [Employee]) {
self.employeeArray = employeeArray
}
mutating func next() -> Int? {
guard index < employeeArray.count else { return nil }
defer { index += 1 }
return employeeArray[index].id
}
}
let employeeArray = [
Employee(id: 1, firstName: "Jon", lastName: "Skeet"),
Employee(id: 2, firstName: "Darin", lastName: "Dimitrov"),
Employee(id: 4, firstName: "Hans", lastName: "Passant")
]
let employeeSequence = EmployeeSequence(employeeArray: employeeArray)
let idArray = Array(employeeSequence)
print(idArray) // prints [1, 2, 4]
5. 사용방법Collection
프로토콜 확장 및AnyIterator
class Employee {
let id: Int, firstName: String, lastName: String
init(id: Int, firstName: String, lastName: String) {
self.id = id
self.firstName = firstName
self.lastName = lastName
}
}
extension Collection where Iterator.Element: Employee {
func getIDs() -> Array<Int> {
var index = startIndex
let iterator: AnyIterator<Int> = AnyIterator {
defer { index = self.index(index, offsetBy: 1) }
return index != self.endIndex ? self[index].id : nil
}
return Array(iterator)
}
}
let employeeArray = [
Employee(id: 1, firstName: "Jon", lastName: "Skeet"),
Employee(id: 2, firstName: "Darin", lastName: "Dimitrov"),
Employee(id: 4, firstName: "Hans", lastName: "Passant")
]
let idArray = employeeArray.getIDs()
print(idArray) // prints [1, 2, 4]
6. KVC 사용 및NSArray
의 메서드
이 예에서는 다음 명령어가 필요합니다.class Employee
물려받다NSObject
.
import Foundation
class Employee: NSObject {
@objc let id: Int, firstName: String, lastName: String
init(id: Int, firstName: String, lastName: String) {
self.id = id
self.firstName = firstName
self.lastName = lastName
}
}
let employeeArray = [
Employee(id: 1, firstName: "Jon", lastName: "Skeet"),
Employee(id: 2, firstName: "Darin", lastName: "Dimitrov"),
Employee(id: 4, firstName: "Hans", lastName: "Passant")
]
let employeeNSArray = employeeArray as NSArray
if let idArray = employeeNSArray.value(forKeyPath: #keyPath(Employee.id)) as? [Int] {
print(idArray) // prints [1, 2, 4]
}
언급URL : https://stackoverflow.com/questions/28393334/get-an-array-of-property-values-from-an-object-array
반응형
'programing' 카테고리의 다른 글
.svn 디렉토리를 무시하려면 어떻게 해야 하나요? (0) | 2023.04.12 |
---|---|
값을 기준으로 개체를 제거할 어레이 확장 (0) | 2023.04.12 |
키-값 튜플 목록을 사전으로 변환하려면 어떻게 해야 합니까? (0) | 2023.04.12 |
변수 이름이 문자열로 저장되는 경우 변수 값을 얻는 방법은 무엇입니까? (0) | 2023.04.12 |
스크립트의 인수를 사용하여 두 번째 스크립트 호출 (0) | 2023.04.12 |