Удаление элемента в массиве typealias Swift - PullRequest
0 голосов
/ 13 марта 2019

Я экспериментирую с внедрением центра уведомлений в Swift

Для данного typealias (я не хочу менять это)

typealias Observer = (_ name: String, _ data: Any) -> Void

Вы можете иметь массив этого:

var observers = [Observer]()

Но тогда как я могу удалить любое имя наблюдателя?

Если у меня есть наблюдатель "myObs"

for i in 0..<observers.count {
            if observers[i].name == "myObs" {
                observers.remove(at: i)
                return
            }
        }

не удалит элемент, поскольку у любого наблюдателя нет имени свойства.

Я хотел использовать протокол, соответствующий AnyObject, но тогда мне нужно будет сохранить имя в протоколе, а также его имя в typealias.

У меня есть фундаментальное недоразумение ... но что это?

Ответы [ 2 ]

1 голос
/ 13 марта 2019

Вы просто используете словарь [String: Observer], как показано ниже:

typealias Observer = (_ name: String, _ data: Any) -> String
let obs: Observer = { (name, data) in
    return name
}
let obs1: Observer = { (name, data) in
    return name
}
var observers = [String: Observer]()
observers[obs("MyObs", "some data")] = obs
observers[obs1("MyObs1", "some data")] = obs1

print(observers)
observers["MyObs"] = nil
print(observers) 

Вывод:

"["MyObs": (Function), "MyObs1": (Function)]\n"
"["MyObs1": (Function)]\n"
1 голос
/ 13 марта 2019

Observer - это псевдоним функции, поэтому name - это в основном параметр, вы не можете этого сделать.

typealias Observer = (_ name: String, _ data: Any) -> Void
var observers = [Observer]()

func observer1(_ name: String, _ data: Any) { }
func observer2(_ name: String, _ data: Any) { }
func observer3(_ name: String, _ data: Any) { }
func observer4(_ name: String, _ data: Any) { }

observers.append(observer1)
observers.append(observer2)
observers.append(observer3)
observers.append(observer4)

observers.forEach { (observer) in
    print(observer) // Just "()"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...