相关疑难解决方法(0)

在Swift中,如何转换为具有关联类型的协议?

在下面的代码中,我想测试是否xSpecialController.如果是的话,我想得到currentValue一个SpecialValue.你怎么做到这一点?如果没有演员,那么其他一些技巧.

最后一行不会编译.错误是:协议"SpecialController"只能用作通用约束,因为它具有Self或关联类型要求.

protocol SpecialController {
    associatedtype SpecialValueType : SpecialValue
    var currentValue: SpecialValueType? { get }
}
...
var x: AnyObject = ...
if let sc = x as? SpecialController {  // does not compile
Run Code Online (Sandbox Code Playgroud)

generics protocols associated-types swift swift3

20
推荐指数
1
解决办法
4604
查看次数

泛型和协议类型函数参数之间的实际差异是什么?

给定没有任何关联类型的协议:

protocol SomeProtocol
{
    var someProperty: Int { get }
}
Run Code Online (Sandbox Code Playgroud)

这两个函数在实践中有什么区别(意思不是"一个是通用的而另一个不是")?它们是否生成不同的代码,它们具有不同的运行时特征吗?当一个或多个协议变得非常重要时,这些差异是否会发生变化?(因为编译器可能内联这样的东西)

func generic<T: SomeProtocol>(some: T) -> Int
{
    return some.someProperty
}

func nonGeneric(some: SomeProtocol) -> Int
{
    return some.someProperty
}
Run Code Online (Sandbox Code Playgroud)

我主要询问编译器的不同之处,我理解两者的语言级含义.基本上,确实nonGeneric意味着一个恒定的代码大小但速度较慢的动态调度,而不是generic每个类型传递的代码大小增加,但是使用快速静态调度?

generics swift swift-protocols

17
推荐指数
1
解决办法
1357
查看次数