在Swift中定义CKRecord上的下标时堆栈溢出

在Swift中定义CKRecord上的下标时堆栈溢出,第1张

概述This question询问是否可以在Swift中使用订阅CKRecord.虽然我已经知道如何做提问者想要的东西,但是它的每个排列都会给我一个堆栈溢出: subscript(key: String) -> CKRecordValue? { get { return objectForKey(key) as CKRecordValue? } set { This question询问是否可以在Swift中使用订阅CKRecord.虽然我已经知道如何做提问者想要的东西,但是它的每个排列都会给我一个堆栈溢出:

subscript(key: String) -> CKRecordValue? {    get {        return objectForKey(key) as CKRecordValue?    }    set {        setobject(newValue,forKey: key)    }}

堆栈溢出发生在getter中. (我从来没有尝试过setter,所以它也可能出现在那里.)我尝试使用objectForKey:,objectForKeyedSubscript:和valueForKey:来实现.所有都产生相同的结果:堆栈溢出.

这很奇怪,因为CKRecord肯定是用Objective-C编写的.为什么它会以递归方式调用Swift的下标方法?这没有道理. Nate Cook在对提问者的回答中,想知道为什么Swift不会自动桥接objectForKeyedSubscript.好吧,也许这样做的代码没有完全烘焙,但是导致了这个问题.我将不得不尝试另一个具有objectForKeyedSubscript的类:

UPDATE

似乎objectForKeyedSubscript:通常是桥接的.我使用适当的方法在Objective-C中创建了一个类,将其添加到桥接头,并且索引器在那里编译而没有问题.更好的是,它没有堆栈溢出.

这意味着CKRecord正在发生一些非常不寻常的事情.

一个理论

如果你在Swift中创建一个来自NSObject的类并使用String作为键来实现它的下标方法,那么这就变成了objectForKeyedSubscript:. (对于“纯Swift”类,我怀疑情况并非如此.)您可以通过将Swift类导入Objective-C并验证objectForKeyedSubscript:是否存在来验证这一点.

由于CKRecord来自NSObject,实现下标会覆盖默认实现.此外,似乎objectForKey:和valueForKey:all最终都被称为objectForKeyedSubscript:,这导致(读取:“与”相同)对下标的调用,这导致堆栈溢出.

这可以解释为什么发生堆栈溢出.它仍然没有解释为什么objectForKeyedSubscript:没有自动桥接,但也许是因为setobject:forKeyedSubscript:的定义与规范的类型签名略有不同: – (voID)setobject:(ID< CKRecordValue>)object forKeyedSubscript :(Nsstring *)key;.这对Objective-C没有任何影响,但可能会使“桥接代码”绊倒.毕竟,斯威夫特很新鲜.

解决方法 经过一些测试和调试(通过子类),我发现,对于CKRecord,objectForKey:确实调用了objectForKeyedSubscript:.另外,在Swift类中实现下标,该类隐式标记@objc(通过从NSObject降序)或显式意味着下标实现为objectForKeyedSubscript:.

这意味着在扩展中实现CKRecord上的下标会隐藏默认实现,这会导致堆栈溢出.

总结

以上是内存溢出为你收集整理的在Swift中定义CKRecord上的下标时堆栈溢出全部内容,希望文章能够帮你解决在Swift中定义CKRecord上的下标时堆栈溢出所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1018780.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存