Nano Hash - криптовалюты, майнинг, программирование

NSNotificationCenter передает структуры как часть UserInfo

Из-за того, что пользовательская информация NSNotificationCenter.defaultCenter().postNotificationName принимает только словари с данными, соответствующими протоколу AnyObject, есть ли у кого-нибудь предложения, как публиковать структуры как часть NSNotification?

Моя первоначальная мысль заключалась в том, чтобы обернуть структуру в класс, но тогда какой смысл в использовании структуры в первую очередь.

Я что-то упустил или это просто результат объединения Swift с API, созданным для Objective C?

Вот демонстрация того, что я описываю: -

class wrapper: NSObject {

  var aStructToWrap: aStruct

  init(theStruct: aStruct) {

    aStructToWrap = theStruct

    super.init()
  }

}

struct aStruct {
    var aValue: String
}

let aRealStruct = aStruct(aValue: "egg")


NSNotificationCenter.defaultCenter().postNotificationName("aKey", object: nil, userInfo: ["anotherKey": aRealStruct]) // ERR: Extra argument 'userinfo' in call

let wrappedStruct = wrapper(theStruct: aRealStruct)

NSNotificationCenter.defaultCenter().postNotificationName("aKey", object: nil, userInfo: ["anotherKey": wrappedStruct]) // no error

Ответы:


1

Проблема в том, что исходный метод Obj-C требует NSDictionary, который принимает только типы объектов в качестве ключей и значений, что переводится в [AnyObject: AnyObject] в Swift, за исключением того, что NSDictionary любит сравнивать свои ключи с isEqual: который находится в NSObject. протокол, поэтому ключ должен быть NSObject (я не знаю, достаточно ли NSObjectProtocol, но Apple решила сделать его NSObject). Следовательно, NSDictionary userInfo должен быть [NSObject: AnyObject] в Swift, поэтому вы не можете поместить туда структуру, и я не думаю, что вы могли бы сделать это и в Objective-C.

К сожалению, потребуется обертка. Мы могли бы поиграть с NSValue и сделать что-то уродливое и неэффективное, но в любом случае лучшее решение — это созданная вами обертка.

Однако вы сделали подкласс NSObject, который не нужен, так что можете выбросить этот код :)

class Wrapper {
    var aStructToWrap: aStruct
    init(theStruct: aStruct) {
        aStructToWrap = theStruct
    }
}


struct aStruct {
    var aValue: String
}

Но мы можем сделать еще лучше! Мы можем сделать общую оболочку для любой структуры или значения (или даже объекта), которые вам нравятся.

class Wrapper<T> {
    var wrappedValue: T
    init(theValue: T) {
        wrappedValue = theValue
    }
}

struct aStruct {
    var aValue: String
}

let aRealStruct = aStruct(aValue: "egg")

let wrappedStruct = Wrapper(theValue: aRealStruct)

NSNotificationCenter.defaultCenter().postNotificationName("aKey", object: nil, userInfo: ["anotherKey": wrappedStruct]) // no error

Это изменяемая оболочка, не стесняйтесь делать ее неизменной, переключая var на let.

25.04.2015
  • Я никогда не использовал дженерики, поэтому мне потребовалось некоторое время, чтобы определить, как вернуть мой Struct. Я использовал объект уведомления, но концепция такая же, если let wrapperItem =notification.object как? Wrapper‹YourStruct› { let foo = wrapperItem.wrappedValue } 27.03.2016
  • Как я могу получить значение, когда я нахожусь в словаре userinfo на AddObserver? 25.04.2016
  • пусть editedStruct = payload.userInfo?[одобрение] как? Wrapper‹aStruct› и увидеть значение print((editedStruct?.wrappedValue.aValue)! as String) @DogCoffee 25.04.2016
  • За исключением использования оболочки, возможно, возврат обернутого объекта с функцией расширения тоже хорош. 21.09.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..