some --- 用在当返回值为不确定类型的情况。
TaleProtocol 语言协议例子,Cat/Robot 实现协议
protocol TalkProtocol {
associatedtype word
func bat() -> word
}
class Cat: TalkProtocol {
typealias word = String
func bat() -> String {
return "miao"
}
}
class Robot: TalkProtocol {
typealias word = Int64
func bat() -> Int64 {
return 10101010
}
}
获取 TalkProtocol 实现对象,并且执行 Bat 方法
func getTalk() -> TalkProtocol {
return Robot()
}
期望获取 对应的 Robot 对象,正确执行 getTalk().bat() 方法,但是在 xcode 执行这段代码的时候会发现 xcode 编译报错。
Protocol 'TalkProtocol' can only be used as a generic constraint because it has Self or associated type requirements
为什么出现这个错误?
解析
背景
声明 TalkProtocol 协议,同时考虑到不同物种的语言是不同的。Cat 的语言为猫语,Robot 机器人我们可以认为是 二进制 语言。
所以协议中存在 『associatedtype word』标识不同物种的语言特性。
Cat 为 String/ Robot 为 Int。
错误分析
翻译 协议“TalkProtocol”只能用作一般约束,因为它具有自身或关联的类型要求
无法将 TalkProtocol 作为返回值(作为一般约束),但是我们发现返回某个协议是常规操作,这个很不合理。这个时候 some 关键字就发挥作用了。
使用
/// 正常使用无报错
func getTalk() -> some TalkProtocol {
return Robot()
}
用在当返回值为不确定类型的情况。
网友评论