Swift 关键字 -- some

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()
}

用在当返回值为不确定类型的情况。

你可能感兴趣的:(Swift 关键字 -- some)