更新:,完整代码
我有这个代码:
struct Set<T : Hashable>: Sequence {
var items: Dictionary<Int, T> = [:]
func append(o: T?) {
if let newValue = o {
items[newValue.hashValue] = newValue
}
}
func generate() -> TypeGenerator<T> {
return TypeGenerator ( Slice<T>( items.values ) )
}
}
我得到错误:
找不到接受提供的参数的'subscript'的重载。
对于该行:
items[newValue.hashValue] = newValue
据我了解,这是因为
newValue
的类型是T
而不是T?
,这意味着它不是可选的。这是因为用于访问键/值对的Dictionary
的subscript
定义为subscript (key: KeyType) -> ValueType?
表示只能接受可选值。在我的情况下,
newValue
在验证后不是nil
后不是可选的。但是,不是包括非可选的可选内容吗?类型+
nil
不是类型的可选内容吗?为什么可以包含所有内容+
nil
的东西拒绝不能为nil
的类型?简要说明:我检查
o
不是nil
的原因是为了能够调用其hashValue
,而该o!.hashValue
不能直接通过可选或未包装的可选组件访问(o
引发编译错误)。我也不能用
items[newValue.hashValue] = o
因为它已验证
hashValue
不是值得分配的可选内容,即使它不允许访问它的ojit_code属性。 最佳答案
字典未定义为存储可选值。只是赋值运算符接受一个可选值,因为给它nil
将从字典中删除整个键。
您遇到的问题是,您尝试使用非变异方法来变异items
属性。您需要将您的方法定义为变异:
mutating func append(o: T?) {
if let newValue = o {
items[newValue.hashValue] = newValue
}
}
将可选变量分配给非可选值当然没有问题:
var optionalString : String? = "Hello, World"
以同样的方式,将字典的键分配给非可选值是完全有效的:
var items : [Int:String] = [:]
items[10] = "Hello, World"
然后,您可以将键分配为nil,以从字典中完全删除键:
items[10] = nil
另外,我认为您对hashValue是什么以及如何使用它有根本的误解。您不应将hashValue的值作为键传递给字典。字典对您提供的值调用hashValue,因此您要使字典采用hashValue的hashValue。
无法保证hashValue会与不同值的所有其他hashValue有所不同。换句话说,“A”的哈希值可以是与“B”相同的哈希值。字典足够复杂,可以处理这种情况,并且仍然可以为您提供特定键的正确值,但是您的代码却无法处理。
关于ios - Swift中非 optional 类型是否应该包含 optional 类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24214752/