相关疑难解决方法(0)

自我协议的行为

我最近在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)

有谁知道这个看似奇怪的行为的原因?

generics protocols swift

9
推荐指数
1
解决办法
395
查看次数

如何在Swift的闭包签名中强制转换参数类型?

我正在尝试在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)

arrays closures casting type-signature swift

5
推荐指数
1
解决办法
1307
查看次数

标签 统计

swift ×2

arrays ×1

casting ×1

closures ×1

generics ×1

protocols ×1

type-signature ×1