swift post_protocol_trait.swift

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了swift post_protocol_trait.swift相关的知识,希望对你有一定的参考价值。

/// 我对trait最好的理解是,trait是附加在一个类型上的可有可无的属性,丰富了原来的类型的特点。
/// PHP的trait是通过声明一个trait的结构,来为其他的类提供某些特性。
/// swift可以通过声明一个结构(enum或者其他),代表一个trait。然后在protocol中声明一个traitType。通过
/// 这个traitType来和某个trait联系对应起来。再使用protocol的contraint特性,将某个trait的特性
/// 提供给这个protocol的“实现者”,但仅限于这个“实现者”带有这个trait,因为一个protocol是可以有
/// 多个adopt(实现者)的。

/// 比如一个protocol:
protocol SomeType {
	associatedtype TraitType // 和实现者的trait做对应
}

/// 一个实现者
struct SomeStruct<Trait> {
}

/// conform the protocol 
extension SomeStruct: SomeType {
	typealias TraitType = Trait // 对应起来
}

/// 到这里,还没体现出trait的优势,上面的traitType等只是swift的generic编程中的普通例子而已。
/// 要使用trait,我们需要借用swift的generic中的Type Constraint,类型约束。通过类型约束,
/// 指定只有某个类型才享有某个特性。那么怎么类型约束呢?提供另外一个类型作为一个身份证,为了详细
/// 可以多创建几个身份证。

enum IdA {}
enum IdB {}

/// 然后我们要将这些身份证附给我们要使用的类型SomeStruct,让这个类型拥有不同的身份,不同的能力。
/// 要这样做,我们不更改SomeStruct,而是通过扩展协议SomeType来达到目的。因为只有使用协议的
/// where语句来做类型的约束。

/// 这里,我们说这个协议中的TraitType是IdA类型的话,它的sayHi方法要做的事情。
extension SomeType where TraitType == IdA {
	func sayHi() {
		print("IdA say hi")
	}
}

/// 这里,我们说这个协议中的TraitType是IdB类型的话,它的sayHi方法要做的事情。
extension SomeType where TraitType == IdB {
	func sayHi() {
		print("IdB say hi")
	}
}

/// 然后,我们可以使用SomeStruct了,因为SomeStruct已经遵从协议SomeType了。

let a = SomeStruct<IdA>()
a.sayHi()  // IdA say hi.

let b = SomeStruct<IdB>()
b.sayHi()  // IdB say hi.

/// 其实是可以直接extension这个struct的。

以上是关于swift post_protocol_trait.swift的主要内容,如果未能解决你的问题,请参考以下文章

Swift 反射

Swift入门系列--Swift官方文档(2.2)--中文翻译--About Swift 关于Swift

swift 示例BS swift.swift

swift swift_bug.swift

ios 整理(一)swift和oc的区别

swift swift_extension5.swift