NSNotificationCenter将结构作为UserInfo的一部分传递

丹尼尔·克雷格

由于NSNotificationCenter.defaultCenter()。postNotificationName userinfo仅接受包含符合AnyObject协议的数据的词典,因此有人对将结构作为NSNotification的一部分发布有任何建议吗?

我最初的想法是将结构包装在类中-但是首先使用结构是什么呢?

我是否遗漏了某些东西,或者仅仅是将Swift与为目标C构建的API混合使用的结果?

这是我正在描述的演示:-

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
理查德·伯克特

问题是原始的Obj-C方法需要一个NSDictionary,它仅将对象类型作为键和值,这会转换为Swift中的[AnyObject:AnyObject],但NSDictionary喜欢将其键与NSObject中的isEqual:进行比较。协议,因此密钥必须是NSObject(我不知道NSObjectProtocol是否足够,但Apple已决定使其成为NSObject)。因此,NSDictionary userInfo在Swift中必须为[NSObject:AnyObject],因此您不能在其中放置结构,而且我也不认为在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使其不可变。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

可变的结构域的一部分

范围超过结构的一部分

通过Rest调用在json中传递fk作为DerivedIdentities的一部分

Golang函数指针作为结构的一部分

将cookie作为node.js请求的一部分传递

将对象作为ng-map标记的一部分传递

ASP.NET MVC传递参数作为url的一部分

MATLAB:将结构字段名称的一部分传递给函数

如何将一个UIViewController作为屏幕的一部分

如何在PowerShell中将参数作为-file的一部分传递

在作为回调一部分的嵌套函数中传递或访问变量

为一部分结构分配内存

如何在angularJs 1.5中将$ scope变量作为组件的templateUrl的一部分传递?

如何在SwiftUI中将View()作为列表的一部分传递?

作为ROBOT框架的一部分传递--form数据

将标题作为CURL的一部分

如何在PHP中将“&”作为字符串的一部分传递?

将变量从代码的一部分传递到另一部分

如何传递会话ID作为Soap请求的一部分?

将数组作为对象的一部分传递给Ajax调用

TagHelper,用于以/ users / edit / 10格式将路径值作为链接的一部分传递

将%20作为url的一部分传递到Twitter Web Intent,但显示为''空白

Django-作为包含的一部分传递flatpage.title变量

C/C++ - 按作为结构一部分的值数组进行复制

将 null 作为 vararg 参数的一部分从 Kotlin 传递给 Java 方法

将参数作为查询字符串或 url 的一部分传递?

函数未作为本机反应中道具的一部分传递

将 --form 文件作为 ROBOT 框架的一部分传递

将标签和功能文件参数作为 Karate.Runner 的一部分传递(Java 调用)

TOP 榜单

热门标签

归档