public protocol Primitive {} extension String: Primitive {} extension Int: Primitive {} extension Double: Primitive {} extension Float: Primitive {} extension Bool: Primitive {} extension Array: Primitive where Element: Primitive {} extension Dictionary: Primitive where Key == String, Value: Primitive {} public protocol UserInfoable { /// Dictionary for keeping information for the implementing object using only Primitives. var userInfo: [String: Primitive] { get set } }