Swift 3에서 배열에서 개체 제거
애플리케이션에서 셀을 선택할 때는 한 개의 객체를 배열로 추가하고 셀을 다시 선택할 때는 객체를 선택 취소하고 제거했습니다.그 코드를 사용했는데 오류가 납니다.
extension Array {
func indexOfObject(object : AnyObject) -> NSInteger {
return (self as NSArray).indexOfObject(object)
}
mutating func removeObject(object : AnyObject) {
for var index = self.indexOfObject(object); index != NSNotFound; index = self.indexOfObject(object) {
self.removeAtIndex(index)
}
}
}
class MyViewController: UITableViewController {
var arrContacts: [Any] = []
var contacts: [Any] = []
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
arrContacts.removeObject(contacts[indexPath.row])
}
}
다음과 같은 두 가지 오류가 발생합니다.
C-style for statement has been removed in Swift 3
Value of type '[Any]' has no member 'removeObject'
스위프트는 다음과 같습니다.NSMutableArray
의removeObject
다음과 같습니다.
var array = ["alpha", "beta", "gamma"]
if let index = array.firstIndex(of: "beta") {
array.remove(at: index)
}
개체가 고유한 경우.캐스팅할 필요가 전혀 없습니다.NSArray
사용.indexOfObject:
APIindex(of:
또한 작동하지만 이것은 불필요한 암시적 브리지 캐스트를 야기합니다.NSArray
.
물론 당신은 확장자를 쓸 수 있습니다.RangeReplaceableCollection
그 기능을 본받습니다.그러나 가치 의미론 때문에 이름을 지을 수 없습니다.removeObject
.
extension RangeReplaceableCollection where Element : Equatable {
@discardableResult
mutating func remove(_ element : Element) -> Element?
{
if let index = firstIndex(of: element) {
return remove(at: index)
}
return nil
}
}
맘에 들다remove(at:
제거된 아이템을 반환합니다.nil
배열에 항목이 포함되어 있지 않은 경우.
동일한 개체가 여러 번 발생하는 경우filter
. 그러나 인덱스가 특정 개체와 연결된 데이터 소스 배열과 같은 경우firstIndex(of
보다 빠르기 때문에 더 좋습니다.filter
.
업데이트:
Swift 4.2+에서는 다음 중 하나 또는 여러 번 발생을 제거할 수 있습니다.beta
다음과 함께:
array.removeAll{$0 == "beta"}
var a = ["one", "two", "three", "four", "five"]
// Remove/filter item with value 'three'
a = a.filter { $0 != "three" }
Swift 3의 경우 index(여기서:)를 사용하고 배열의 개체($0)를 원하는 개체와 비교하는 클로저를 포함할 수 있습니다.
var array = ["alpha", "beta", "gamma"]
if let index = array.index(where: {$0 == "beta"}) {
array.remove(at: index)
}
또 다른 좋고 유용한 솔루션은 다음과 같은 확장 기능을 만드는 것입니다.
extension Array where Element: Equatable {
@discardableResult mutating func remove(object: Element) -> Bool {
if let index = index(of: object) {
self.remove(at: index)
return true
}
return false
}
@discardableResult mutating func remove(where predicate: (Array.Iterator.Element) -> Bool) -> Bool {
if let index = self.index(where: { (element) -> Bool in
return predicate(element)
}) {
self.remove(at: index)
return true
}
return false
}
}
이와 같이 사용자 지정 개체가 있는 배열이 있는 경우:
let obj1 = MyObject(id: 1)
let obj2 = MyObject(id: 2)
var array: [MyObject] = [obj1, obj2]
array.remove(where: { (obj) -> Bool in
return obj.id == 1
})
// OR
array.remove(object: obj2)
스위프트 5에서, 이것을(를 사용합니다.Extension
:
extension Array where Element: Equatable{
mutating func remove (element: Element) {
if let i = self.firstIndex(of: element) {
self.remove(at: i)
}
}
}
예:
var array = ["alpha", "beta", "gamma"]
array.remove(element: "beta")
스위프트 3에서 사용하기Extension
:
extension Array where Element: Equatable{
mutating func remove (element: Element) {
if let i = self.index(of: element) {
self.remove(at: i)
}
}
}
예:
var array = ["alpha", "beta", "gamma"]
array.remove(element: "beta")
for var index = self.indexOfObject(object); index != NSNotFound; index = self.indexOfObject(object)
는 C 스타일의 루프용이며 제거되었습니다.코드를 다음과 같이 변경하여 루프가 발생한 경우 유사한 개체를 모두 제거합니다.
let indexes = arrContacts.enumerated().filter { $0.element == contacts[indexPath.row] }.map{ $0.offset } for index in indexes.reversed() { arrContacts.remove(at: index) }
Swift 3에서 이러한 객체(array)의 배열(array)에서 고유 객체(objectToRemove)("objectToRemove")를 삭제하기 위한 한 줄의 정확한 해결책은 다음과 같습니다.
if let index = array.enumerated().filter( { $0.element === objectToRemove }).map({ $0.offset }).first {
array.remove(at: index)
}
스위프트 4
var students = ["Kofi", "Abena", "Peter", "Kweku", "Akosua"]
if let index = students.firstIndex(where: { $0.hasPrefix("A") }) {
students.remove(at: index)
}
스위프트 배열에서 개체 제거
스위프트 3과 스위프트 4에서
var array = ["a", "b", "c", "d", "e", "f"]
for (index, element) in array.enumerated().reversed() {
array.remove(at: index)
}
Swift 4.2를 통해 더욱 고급화된 접근 방식(더 빠르고 메모리 효율적)을 사용할 수 있습니다.
array.removeAll(where: { $0 == "c" })
대신에
array = array.filter { !$0.hasPrefix("c") }
여기서 자세히 보기
스위프트 3에서 이것을 시도해보세요.
array.remove(at: Index)
대신에
array.removeAtIndex(index)
갱신하다
"Declaration is only valid at file scope".
개체가 범위 내에 있는지 확인합니다.스코프를 기본값인 "내부"로 지정할 수 있습니다.
index(of:<Object>)
일을 하기 위해서, 수업은 따라야 합니다.Equatable
특정 개체의 인덱스를 찾는 공식 답변입니다. 그러면 해당 인덱스를 사용하여 개체를 쉽게 제거할 수 있습니다.
var students = ["Ben", "Ivy", "Jordell", "Maxime"]
if let i = students.firstIndex(of: "Maxime") {
// students[i] = "Max"
students.remove(at: i)
}
print(students)
// Prints ["Ben", "Ivy", "Jordell"]
다음은 링크입니다. https://developer.apple.com/documentation/swift/array/2994720-firstindex
어레이를 쉽게 사용할 수 있도록 확장하고 Swift 4.2 이상을 체인으로 연결할 수 있도록 지원합니다.
public extension Array where Element: Equatable {
@discardableResult
public mutating func remove(_ item: Element) -> Array {
if let index = firstIndex(where: { item == $0 }) {
remove(at: index)
}
return self
}
@discardableResult
public mutating func removeAll(_ item: Element) -> Array {
removeAll(where: { item == $0 })
return self
}
}
이것이 제가 사용한 것입니다(Swift 5).
extension Array where Element:Equatable
{
@discardableResult
mutating func removeFirst(_ item:Any ) -> Any? {
for index in 0..<self.count {
if(item as? Element == self[index]) {
return self.remove(at: index)
}
}
return nil
}
@discardableResult
mutating func removeLast(_ item:Any ) -> Any? {
var index = self.count-1
while index >= 0 {
if(item as? Element == self[index]) {
return self.remove(at: index)
}
index -= 1
}
return nil
}
}
var arrContacts:[String] = ["A","B","D","C","B","D"]
var contacts: [Any] = ["B","D"]
print(arrContacts)
var index = 1
arrContacts.removeFirst(contacts[index])
print(arrContacts)
index = 0
arrContacts.removeLast(contacts[index])
print(arrContacts)
결과:
["A", "B", "D", "C", "B", "D"]
["A", "B", "C", "B", "D"]
["A", "B", "C", "D"]
중요:항목을 제거할 배열에는 개체, 문자열, 숫자 등과 같은 등식 요소가 포함되어야 합니다.
언급URL : https://stackoverflow.com/questions/40859066/removing-object-from-array-in-swift-3
'programing' 카테고리의 다른 글
Python을 사용하여 Excel 파일을 실행 (0) | 2023.09.08 |
---|---|
Excel 파일 c#에서 새 워크시트를 생성하는 방법은? (0) | 2023.09.08 |
docker-compose.yml에서 서비스를 비활성화할 수 있는 방법이 있습니까? (0) | 2023.09.08 |
오류 코드: 1406.데이터가 너무 길어서 열에 사용할 수 없음 - MySQL (0) | 2023.09.08 |
JWT를 사용한 소켓 IO 연결 인증 (0) | 2023.09.03 |