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])
}
}
다음과 같은 2 개의 오류가 발생합니다.
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:
API index(of:
도 작동하지만 이로 인해 불필요한 암시 적 브리지가 NSArray
.
동일한 개체가 여러 번 발생하는 경우 filter
. 그러나 firstIndex(of
더 빨리 배열 과 같은 경우 데이터 소스의 배열과 같은 것 filter
입니다.
최신 정보 :
스위프트 4.2 이상에서는 beta
과를 하나 또는 여러 번 제거 할 수 있습니다 .removeAll(where:)
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 (where :)를 사용하고 배열의 ($ 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)
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에서는 다음을 사용하십시오 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")
스위프트 4
var students = ["Kofi", "Abena", "Peter", "Kweku", "Akosua"]
if let index = students.firstIndex(where: { $0.hasPrefix("A") }) {
students.remove(at: index)
}
Swift 3의 객체 배열 ( "array")에서 고유 한 객체 ( "objectToRemove"함)를 삭제하기위한 것입니다.
if let index = array.enumerated().filter( { $0.element === objectToRemove }).map({ $0.offset }).first {
array.remove(at: index)
}
Swift 3에서 시도 시도
array.remove(at: Index)
대신에
array.removeAtIndex(index)
최신 정보
"Declaration is only valid at file scope".
개체가 범위 유효성 확인하십시오. "내부"범위를 이용할 수 있습니다.
index(of:<Object>)
일 비용 수업은 Equatable
배열을 쉽게 수행하고 연결을 허용하는 확장 :
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
}
}
에서는 스위프트 (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") }
여기에서 더 읽어보기
이것은 특정 객체의 색인을 찾는 공식적인 답변이므로 해당 색인을 사용하여 모든 객체를 쉽게 제거 할 수 있습니다.
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
참고 URL : https://stackoverflow.com/questions/40859066/removing-object-from-array-in-swift-3
'ProgramingTip' 카테고리의 다른 글
URL에서 포트 번호를 제거하는 방법 (0) | 2020.12.02 |
---|---|
Flutter에서 반경이있는 둥근 버튼 / 버튼 만들기 (0) | 2020.12.02 |
정규식 단어 일치 (0) | 2020.12.01 |
자바 커스텀 생성 화 (0) | 2020.12.01 |
점 ( ".") 연산자와 화살표 ( "->") 연산자는 C와 Objective-C에서 사용됩니다. (0) | 2020.12.01 |