我最近在Swift中阅读了Protocols,Generic Type Constraints和Arrays.我的问题涉及博客中的以下两个例子:
代码:
protocol MyProtocol1 {
var myValue: Self { get }
}
let array: [MyProtocol1] = [] // Error.
Run Code Online (Sandbox Code Playgroud)
产生错误:
协议"MyProtocol1"只能用作通用约束,因为它具有Self或关联类型要求.
这是预期的,并且有关于该主题的几个SO问题.但是,通过更改myValue为函数,不再有任何错误,但在这两种情况下Self都会返回.
protocol MyProtocol2 {
func myValue() -> Self
}
let array: [MyProtocol2] = [] // This is okay.
Run Code Online (Sandbox Code Playgroud)
有谁知道这个看似奇怪的行为的原因?
我正在尝试在Swift(目前是Swift 2)中编写一个轻型观察者类。这个想法是在实体组件系统中使用它,作为组件之间彼此通信而不耦合的一种方式。
我遇到的问题是所有类型的数据都可以通信,a CGVector,an NSTimeInterval等等。这意味着,传递的方法可能有各种型签名(CGVector) -> Void,() -> Void等等。
我希望能够将这些不同的签名存储在数组中,但仍然具有一定的类型安全性。我的想法是数组的类型应该是(Any) -> Void或(Any?) -> Void,这样我至少可以确保它包含方法。但我有这样烦恼的传球方法:Cannot convert value of type '(CGVector) -> ()' to expected argument type '(Any) -> ()'。
//: Playground - noun: a place where people can play
import Cocoa
import Foundation
enum EventName: String {
case input, update
}
struct Binding{
let listener: Component
let action: (Any) -> ()
}
class EventManager {
var events = …Run Code Online (Sandbox Code Playgroud)