更新:,完整代码

我有这个代码:

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?,这意味着它不是可选的。这是因为用于访问键/值对的Dictionarysubscript定义为
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/

10-11 20:13