สมมติว่าฉันมีโปรโตคอล:
public protocol Printable {
typealias T
func Print(val:T)
}
และนี่คือการนำไปใช้งาน
class Printer<T> : Printable {
func Print(val: T) {
println(val)
}
}
ความคาดหวังของฉันคือฉันต้องสามารถใช้Printable
ตัวแปรเพื่อพิมพ์ค่าเช่นนี้:
let p:Printable = Printer<Int>()
p.Print(67)
คอมไพเลอร์บ่นด้วยข้อผิดพลาดนี้:
"โปรโตคอล" พิมพ์ได้ "สามารถใช้เป็นข้อ จำกัด ทั่วไปเท่านั้นเนื่องจากมีข้อกำหนดในตนเองหรือประเภทที่เกี่ยวข้อง
ฉันทำอะไรผิดหรือเปล่า? เพื่อแก้ไขปัญหานี้หรือไม่?
**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)
แก้ไข 2: ตัวอย่างโลกแห่งความจริงของสิ่งที่ฉันต้องการ โปรดทราบว่าสิ่งนี้จะไม่รวบรวม แต่นำเสนอสิ่งที่ฉันต้องการบรรลุ
protocol Printable
{
func Print()
}
protocol CollectionType<T where T:Printable> : SequenceType
{
.....
/// here goes implementation
.....
}
public class Collection<T where T:Printable> : CollectionType<T>
{
......
}
let col:CollectionType<Int> = SomeFunctiionThatReturnsIntCollection()
for item in col {
item.Print()
}