struct Pos: IntegerLiteralConvertible { var x: Int = 0 var y: Int = 0 init(integerLiteral value: IntegerLiteralType) { x = value y = value } } let pos: Pos = 100 //正常情况下,是无法用=号直接初始化结构体的,因为Pos继承了IntegerLiteralConvertible 协议(接口)所以没有问题。 println(pos.x) println(pos.y) /* 同样的还有 BooleanLiteralConvertible FloatLiteralConvertible StringLiteralConvertible ArrayLiteralConvertible DictionaryLiteralConvertible NilLiteralConvertible */ //再看一个Class的例子 class Person: StringLiteralConvertible { var name = "" init(name n:String){ name = n } typealias ExtendedGraphemeClusterLiteralType = String typealias UnicodeScalarLiteralType = String required convenience init(stringLiteral value: StringLiteralType){ self.init(name: value) } //实际上起作用的是上面的方法,但是因为 StringLiteralConvertible 同样继承自定义了下面两个方法的协议(代理),所以也要定义一次 required convenience init(extendedGraphemeClusterLiteral value: ExtendedGraphemeClusterLiteralType){ self.init(name: value) } required convenience init(unicodeScalarLiteral value: UnicodeScalarLiteralType){ self.init(name: value) } func call() { println(name) } } var zhang: Person = "123123" zhang.call() //123123