假设我有一个协议:
public protocol Printable {
typealias T
func Print(val:T)
}
Run Code Online (Sandbox Code Playgroud)
这是实施
class Printer<T> : Printable {
func Print(val: T) {
println(val)
}
}
Run Code Online (Sandbox Code Playgroud)
我的期望是我必须能够使用Printable变量来打印这样的值:
let p:Printable = Printer<Int>()
p.Print(67)
Run Code Online (Sandbox Code Playgroud)
编译器抱怨此错误:
"protocol'Printable'只能用作通用约束,因为它具有Self或相关的类型要求"
难道我做错了什么 ?有任何解决这个问题的方法吗 ?
**EDIT :** Adding similar code that works in C#
public interface IPrintable<T>
{
void Print(T val);
}
public class Printer<T> : IPrintable<T>
{
public void Print(T val)
{
Console.WriteLine(val);
}
}
//.... inside Main
.....
IPrintable<int> p = new Printer<int>();
p.Print(67)
Run Code Online (Sandbox Code Playgroud)
编辑2:我想要的真实世界的例子.请注意,这不会编译,但会呈现我想要实现的目标.
protocol Printable …Run Code Online (Sandbox Code Playgroud) 以下代码在线给我一个错误return p.foo(self).错误说:'P' does not have a member named 'foo'.
protocol P {
typealias T
func foo(c: C<T>) -> T
func foo2() -> T
}
class C<T> {
var p: P
init (p: P) {
self.p = p
}
func bar() -> T {
return p.foo(self);
}
}
Run Code Online (Sandbox Code Playgroud)
该协议P定义了一个相关的类型,它应该与任何专门的C类型正确匹配.我错过了什么吗?或不?