Gre*_*ley 6 subscript-operator swift cloudkit ckrecord
这个问题询问是否可以CKRecord
在Swift中使用下标.虽然我已经知道如何做提问者想要的东西,但是它的每个排列都会给我一个堆栈溢出:
subscript(key: String) -> CKRecordValue? {
get {
return objectForKey(key) as CKRecordValue?
}
set {
setObject(newValue, forKey: key)
}
}
Run Code Online (Sandbox Code Playgroud)
堆栈溢出发生在getter中.(我从来没有尝试过的制定者,所以它可能有发生了.)我已经试过与实施objectForKey:
,objectForKeyedSubscript:
以及valueForKey:
.所有都产生相同的结果:堆栈溢出.
这很奇怪,因为CKRecord
肯定是用Objective-C编写的.为什么它会以递归方式调用Swift的subscript
方法?这没有道理.Nate Cook在对提问者的回答中,想知道为什么Swift不会objectForKeyedSubscript:
自动桥接.好吧,也许这样做的代码没有完全烘焙,但是导致了这个问题.我将不得不尝试与另一个类objectForKeyedSubscript:
.
它似乎objectForKeyedSubscript:
通常是桥接的.我使用适当的方法在Objective-C中创建了一个类,将其添加到桥接头,并且索引器在那里编译而没有问题.更好的是,它没有堆栈溢出.
这意味着正在发生一些非常不寻常的事情CKRecord
.
如果你在Swift中创建一个类,NSObject
并subscript
使用a String
作为键来实现它的方法,那就变成了objectForKeyedSubscript:
.(对于"纯Swift"类,我怀疑情况并非如此.)您可以通过将Swift类导入Objective-C并验证objectForKeyedSubscript:
是否存在来验证这一点.
从CKRecord
下降开始NSObject
,实现subscript
覆盖默认实现.此外,它似乎objectForKey:
和valueForKey:
所有最终叫objectForKeyedSubscript:
,这会导致(读:"是一样的")的调用subscript
,这会导致堆栈溢出.
这可以解释为什么发生堆栈溢出.它仍然没有解释为什么objectForKeyedSubscript:
没有自动桥接,但也许是因为定义setObject:forKeyedSubscript:
与规范的类型签名略有不同:- (void)setObject:(id <CKRecordValue>)object forKeyedSubscript:(NSString *)key;
.这对Objective-C没有任何影响,但可能会使"桥接代码"绊倒.毕竟,斯威夫特很新鲜.
CKRecord
经过一些测试和调试(通过子类) ,我发现 forobjectForKey:
确实调用了objectForKeyedSubscript:
. 此外,在隐式标记(从 降序)或显式标记subscript
的 Swift 类中实现意味着实现为.@objc
NSObject
subscript
objectForKeyedSubscript:
这意味着在扩展中实现subscript
onCKRecord
会隐藏默认实现,从而导致堆栈溢出。
归档时间: |
|
查看次数: |
825 次 |
最近记录: |