在Swift 3.x中是否可以指定字典中允许的对象类型?
如果在声明时我们可以传递一组允许的对象类型,那就太好了。
答案 0 :(得分:3)
您可以通过自定义协议实现此目标,该协议仅由您希望在字典中允许的类型实现:
protocol AllowedDictionaryValue: {}
extension String: AllowedDictionaryValue {}
extension Int: AllowedDictionaryValue {}
extension MyClass: AllowedDictionaryValue {}
extension MyEnum: AllowedDictionaryValue {}
let dictionary: [String:AllowedDictionaryValue] = ...
上述词典仅包含String
,Int
,MyClass
个实例和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)")
}
}