Swift   发布时间:2022-04-30  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了将Swift泛型类转换为具有typealias的协议大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_301_4@
我疯了还是不应该这个快速代码编译?

protocol Protocol {
  typealias Thing
}

class Class<X>: Protocol {
  typealias Thing = X
}

func test<X:Protocol where X.Thing == Int> () -> X {
  return Class<Int>()  // error: cAnnot convert return expression of type 'Class<Int>' to return type 'X'
}

即使泛型类型和aliastype匹配,我似乎无法将对象强制转换为其协议.

编辑:

我通过从现有代码提取逻辑来提出上述代码,以简化问题.这样做我犯了一些错误.这是一个更新的(并且希望不那么令人困惑)代码例:

protocol Protocol {
    typealias Thing
}
class Class<X>: Protocol {
    typealias Thing = X
}
func test<Y: Protocol where Y.Thing == Int> () -> Y {
    return Class<Y.Thing>()
}

我希望编译器允许test()编译,结果类型为Protocol< Int>.

@H_301_4@

解决方法

在今天的Swift中你的回归类型是不可能的.具有关联类型(PAT)的协议是抽象的.应用where子句不会改变它.虑以下代码

let x: <what-GOES-HERE?> = test()

x会是什么类型的?没有什么可以写在那里编译. x.Type会返回什么?你想要的是Protocol,其中protocol.Thing == Int,但这不是Swift中的一个类型.这是一种类型约束.这是今天可以使用PAT的唯一方法.这就是为什么你不能拥有CollectionType< Int>类型的属性,以及为什么你不能编写test()函数.

解决方案是一种类型橡皮擦,可将您的协议转换为具体的结构.例如:

protocol Protocol {
    typealias Thing
    func dosomething() -> Thing?
}
class Class<X>: Protocol {
    typealias Thing = X
    func dosomething() -> Thing? {
        return nil
    }
}

struct AnyProtocol<Thing> {
    var _dosomething: () -> Thing?
    func dosomething() -> Thing? {
        return _dosomething()
    }
}

func test() -> AnyProtocol<Int> {
    return AnyProtocol(_dosomething: Class<Int>().dosomething)
}

Swift的某些未来版本可能会为您自动生成这些类型的橡皮擦,但我不知道任何具体的Swift-evolution建议,所以我们今天必须手工编写它们.

有关构建和使用类型擦除器的更多信息,请参阅A Little Respect for AnySequence.

@H_301_4@ @H_301_4@
@H_301_4@
@H_301_4@
本图文内容来源于网友网络收集整理提供,作为学习参使用,版权属于原作者。

猜你在找的Swift相关文章

摘要 本文不探讨子线程、主线程、同步和异步的常规操作。只是使用DispatchWorkItem 属性来处理1.子线程切换到主线程和2.主动停止正在进行的线程这两种场景,提供一些不同的实现思路。 Dis
应用场景 在 APP 的生命周期中,可以显示提示页面或者自定义弹框时。 或者想要获取到视图的根控制器做其他处理时。 就需要先获取 Window 视图,在这个视图上做显示提示页面或者自定义弹框。 核心逻
摘要 知其然,更要知其所以然。前段时间用 String 转换 Int 处理时,发现一种情况返回 nil,就换成 String 转换 Double 的方式处理。今天就要来看看这种返回 nil 的情况是怎
摘要 要实现一组重复的动画,本质上就是找到动画开始点、结束点。在动画结束的时候,触发开始点,持续这样的动作。 这里面要梳理的逻辑就是1.触发开始点和2.监听动画结束点。这两个逻辑是实现重复动画的基础。
应用场景 自定义画圆或者圆弧。 核心逻辑/代码 使用UIBezierPath(arcCenter: CGPoint, radius: CGFloat, startAngle: CGFloat, end
应用场景 iOS 机制规定,当处理 UI 事件时,需要在主线程中进行,比如刷新页面,添加控件等。 若把一些计算等耗时操作在子线程处理完成后,再回到主线程处理 UI 事件时,需要先切换到主线程。 核心逻
应用场景 UI 页面需要显示保留 n 位小数的数据,但是目前的数据不是 String 类型。这时,就需要将这个数据转换为 String 类型。 API 及语言 String Swift 核心逻辑/代码
1. 安装 clang 编译器clang 编译器是苹果公司提供的 C 编译器,是 Swift 必需的一个组件。在终端运行下面命令执行安装sudo apt-get --assume-yes install clang或者去 Ubuntu 软件中心搜索 Clang 安装即可极客在安装Clang的时候出现过以下问题解决方法:打开Ub

将Swift泛型类转换为具有typealias的协议

微信公众号搜 "程序精选"关注

大佬总结

以上是大佬教程为你收集整理的将Swift泛型类转换为具有typealias的协议全部内容,希望文章能够帮你解决将Swift泛型类转换为具有typealias的协议所遇到的程序开发问题。

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

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