Swift   发布时间:2022-04-30  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Swift协议扩展实现具有共享关联类型的另一协议大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
虑以下:

protocol Foo {
  typealias A
  func Hello() -> A
}
protocol FooBar: Foo {
  func hi() -> A
}
extension FooBar {
  func Hello() -> A {
    return hi()
  }
}

class FooBarClass: FooBar {
  typealias A = String
  func hi() -> String {
    return "Hello world"
  }
}

这段代码编译.但是如果我注释掉关联类型类型A = String的显式定义,那么由于某种原因,swiftc无法推断出类型.

我感觉这与两个共享相同关联类型但没有直接断言的协议有关,例如,类型参数化(可能关联类型不够强大/不够成熟?),这使得类型推断模糊不清.

我不确定这是否是该语言的错误/不成熟,或者可能,我错过了协议扩展中的一些细微差别,这恰恰导致了这种行为.

有人可以对此有所了解吗?

解决方法

看看这个例子

protocol Foo {
    typealias A
    func Hello() -> A
}
protocol FooBar: Foo {
    typealias B
    func hi() -> B
}
extension FooBar {
    func Hello() -> B {
        return hi()
    }
}

class FooBarClass: FooBar {
    //typealias A = String
    func hi() -> String {
        return "Hello world"
    }
}

与泛型

class FooBarClass<T>: FooBar {
    var t: T?
    func hi() -> T? {
        return t
    }
}

let fbc: FooBarClass<Int> = FooBarClass()
fbc.t = 10
fbc.Hello() // 10
fbc.hi()    // 10

大佬总结

以上是大佬教程为你收集整理的Swift协议扩展实现具有共享关联类型的另一协议全部内容,希望文章能够帮你解决Swift协议扩展实现具有共享关联类型的另一协议所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。