我想创建一个不限制键类型的字典
(如NSDicpedia
)
所以我试过了
var dict = Dictionary<Any, Int>()
和
var dict = Dictionary<AnyObject, Int>()
结果
error: type 'Any' does not conform to protocol 'Hashable'
var dict = Dictionary<Any, Int>()
^
<REPL>:5:12: error: cannot convert the expression's type '<<error type>>' to type '$T1'
var dict = Dictionary<Any, Int>()
^~~~~~~~~~~~~~~~~~~~~~
好的,我会用Hasable
var dict = Dictionary<Hashable, Int>()
但是
error: type 'Hashable' does not conform to protocol 'Equatable'
var dict = Dictionary<Hashable, Int>()
^
Swift.Equatable:2:8: note: '==' requirement refers to 'Self' type
func ==(lhs: Self, rhs: Self) -> Bool
^
Swift.Hashable:1:10: note: type 'Hashable' does not conform to inherited protocol 'Equatable.Protocol'
protocol Hashable : Equatable
^
<REPL>:5:12: error: cannot convert the expression's type '<<error type>>' to type '$T1'
var dict = Dictionary<Hashable, Int>()
^~~~~~~~~~~~~~~~~~~~~~~~~~~
所以Hasable
继承自赤道
,但它不符合赤道
???我不明白...
不管怎样,继续努力
typealias KeyType = protocol<Hashable, Equatable> // KeyType is both Hashable and Equatable
var dict = Dictionary<KeyType, Int>() // now you happy?
没有运气
error: type 'KeyType' does not conform to protocol 'Equatable'
var dict = Dictionary<KeyType, Int>()
^
Swift.Equatable:2:8: note: '==' requirement refers to 'Self' type
func ==(lhs: Self, rhs: Self) -> Bool
^
Swift.Hashable:1:10: note: type 'KeyType' does not conform to inherited protocol 'Equatable.Protocol'
protocol Hashable : Equatable
^
<REPL>:6:12: error: cannot convert the expression's type '<<error type>>' to type '$T1'
var dict = Dictionary<KeyType, Int>()
^~~~~~~~~~~~~~~~~~~~~~~~~~
我现在很迷茫,我怎么能让编译器对我的代码满意呢?
我想像这样使用字典
var dict = Dictionary<Any, Int>()
dict[1] = 2
dict["key"] = 3
dict[SomeEnum.SomeValue] = 4
我知道我能用字典
我在Apple Dev论坛上的另一篇帖子上自由地交叉发布/链接到这个问题,这个问题在这里得到了回答。
上述链接的答案适用于6.1及更高版本:
struct AnyKey: Hashable {
private let underlying: Any
private let hashValueFunc: () -> Int
private let equalityFunc: (Any) -> Bool
init<T: Hashable>(_ key: T) {
underlying = key
// Capture the key's hashability and equatability using closures.
// The Key shares the hash of the underlying value.
hashValueFunc = { key.hashValue }
// The Key is equal to a Key of the same underlying type,
// whose underlying value is "==" to ours.
equalityFunc = {
if let other = $0 as? T {
return key == other
}
return false
}
}
var hashValue: Int { return hashValueFunc() }
}
func ==(x: AnyKey, y: AnyKey) -> Bool {
return x.equalityFunc(y.underlying)
}
我相信,从Swift 1.2开始,您可以使用ObjectIdentifier结构来实现这一点。它实现了Hashable(因此也是equalable)和Comparable。可以使用它包装任何类实例。我猜实现使用包装对象的底层地址作为hashValue,以及==运算符。
您现在可以使用AnyHashable
,这是一个类型擦除的可哈希值,完全是为以下情况创建的:
var dict=字典
我试图根据现场画廊的图片显示不同的状态。thymeleaf状态 使用GalleryPicture.status定义为枚举,如下所示: 但thymeleaf同时适用于所有3种情况。我的代码有什么问题?
问题内容: 我将jquery,JSON和AJAX用于注释系统。我很好奇,可以通过JSON发送/存储的内容是否有大小限制?就像用户输入大量内容并通过JSON发送一样,是否存在某种最大限制? 也可以通过JSON发送任何类型的文本。例如,有时我允许用户使用html,这样可以吗? 问题答案: JSON与其他数据格式(如XML)相似- 如果您需要传输更多数据,则只需发送更多数据。JSON请求没有固有的大小限
问题内容: 在Java中,StringBuilder是否有最大字符限制? StringBuilder变量“ url”是否具有最大容量,或者它可以容纳所有内容? 问题答案: 是的,它的最大整数容量有2147483647(技术上)的限制。 在内部将特性置于对象中,并且数组的大小受到限制。
问题内容: 最多可以在Java的java.util.List中添加多少数据? ArrayList是否有默认大小? 问题答案: 这取决于实现方式。由于您使用s 为数组建立索引,因此an 不能容纳多个元素。不过,A 并不受相同方式的限制,并且可以包含任意数量的元素。
我的设置: 格拉德卢:
StringBuilder对JAVA的最大容量有字符限制吗? 字符串生成器变量“url”是否具有最大容量,或者它可以容纳所有内容?