내 응용 프로그램에서 셀을 선택할 때 배열에 하나의 개체를 추가하고 셀을 다시 선택할 때 개체를 선택 취소하고 제거했습니다. 그 코드를 사용했지만 오류가 발생했습니다.
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
.
최신 정보:
Swift 4.2 이상에서는 beta
with를 하나 또는 여러 번 제거 할 수 있습니다 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)
답변
에서 스위프트 (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 스타일의 for 루프이며 제거되었습니다. -
루프가 발생한 경우 유사한 객체를 모두 제거하려면 코드를 다음과 같이 변경하십시오.
let indexes = arrContacts.enumerated().filter { $0.element == contacts[indexPath.row] }.map{ $0.offset } for index in indexes.reversed() { arrContacts.remove(at: index) }
답변
스위프트 4
var students = ["Kofi", "Abena", "Peter", "Kweku", "Akosua"]
if let index = students.firstIndex(where: { $0.hasPrefix("A") }) {
students.remove(at: index)
}