是否可以指定字典中允许的对象类型?

时间:2017-01-04 16:14:45

标签: swift dictionary swift3 object-type

在Swift 3.x中是否可以指定字典中允许的对象类型?

如果在声明时我们可以传递一组允许的对象类型,那就太好了。

2 个答案:

答案 0 :(得分:3)

您可以通过自定义协议实现此目标,该协议仅由您希望在字典中允许的类型实现:

protocol AllowedDictionaryValue: {}

extension String: AllowedDictionaryValue {}
extension Int: AllowedDictionaryValue {}
extension MyClass: AllowedDictionaryValue {}
extension MyEnum: AllowedDictionaryValue {}

let dictionary: [String:AllowedDictionaryValue] = ...

上述词典仅包含StringIntMyClass个实例和MyEnum值。

通过这种方式,您可以只在字典中使用所需的值,同时保持字典不同。

答案 1 :(得分:1)

您可以使用带有关联值的枚举来完成此行为,这在其他语言中称为标记联合。它基本上是一种类型,可以限制为任意类型的类型而不是Any或AnyObject。枚举部分是标记,它告诉您您拥有的数据类型以及相关值是该类型的实际数据。这并不是说使用Any或AnyObject的优点是switch语句是详尽的,编译器可以强制你在编译时处理所有的情况,而如果你使用带有if语句链的Any,则不是这样。

    import PlaygroundSupport
    import UIKit


    enum Number {
        case integer(Int), double(Double), currency(NSDecimalNumber)
    }
    var dictionary: [String : Number] = [ "a" : .integer(1), "b" : .double(2), "c" : .currency(NSDecimalNumber(value: 3))]

    for (key, value) in dictionary {
        switch value {
        case .integer(let number):
            print ("\(key) has a type of \(type(of: number)) with a value of \(number)")
        case .double(let number):
            print ("\(key) has a type of \(type(of: number)) with a value of \(number)")
        case .currency(let number):
            print ("\(key) has a type of \(type(of: number)) with a value of \(number)")
        }
    }