问题标签 [swift-protocols]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1776 浏览

swift - 注释支持协议一致性的 Swift 函数声明?

在 Swift 中是否有一种标准机制来注释函数声明以表明它们存在是因为类符合某些协议?

例如,此声明可能存在,因为类符合NSCoding. (用 标记override会导致语法错误,所以它不是我正在寻找的那种注释。)理想情况下,我正在寻找代码级注释(例如override,而不是/*! ... */)。

0 投票
1 回答
169 浏览

swift - 将具有多个泛型类型的枚举作为参数传递

我有 Swift 2 的问题 - XCode 版本 7.0 beta 5 (7A176x)

我有一个具有两种通用类型的枚举状态。函数printState接受 State 参数并根据参数打印“One”或“Two”

当我如下调用 printState 时。

在第二次调用 printState 时出现编译错误 -

错误:无法使用类型为“(secondStruct:Struct2)”的参数列表调用“Two” printState(State.Two(secondStruct:Struct2()))

如果 T 和 U 受限于类类型,则一切正常。但仅当 T 和 U 是协议类型时,我才会收到此错误。此外,我可以通过使案例二也接受协议 1 来消除此错误,但它并不真正需要它。

为什么我会收到此错误?我怎样才能使这个工作,以便案例二只接受协议 1。

0 投票
2 回答
55 浏览

swift - 在 Swift 中指定协议之间的关系

我想指定一个协议来管理一些符合另一个协议的类型对象。像这样:

当试图编译这个时,我得到一个错误:

暗示候选人func getElements() -> [FooElement]的类型不匹配() -> [FooElement],但它期望() -> [Element].

如何修复这种错误?

更新:

该解决方案似乎有效:

但是当我尝试创建这样的变量时:

出现一个新错误:

0 投票
1 回答
5289 浏览

ios - 无法声明具有内部要求的公共协议扩展

我正在编写一个媒体播放器应用程序,并创建了自己的框架来管理所有播放器功能。在这个框架中,我有一个名为的公共协议PlayerControllerType和一个内部协议_PlayerControllerType。在PlayerControllerType我已经声明了所有应该可以从框架外部访问的方法和属性。在_PlayerControllerType我定义了几个属性,它们由PlayerControllerType框架内实现的具体类型使用。其中一种类型是PlayerController. 其声明如下:

现在我想为我的框架中的类提供几个默认实现,它们符合PlayerControllerType和 internal _PlayerControllerType,例如:

这在 Xcode 7 Beta 4 中按预期工作。昨天我更新到 Beta 6 并收到此错误:“扩展不能被声明为公共,因为它的通用要求使用内部类型”(另见屏幕截图)。 Xcode中的错误

我觉得这个错误很烦人。当然,我的框架之外的任何类型都不会受益于这个扩展,因为它无法访问内部协议,但它对于我的框架内同时实现和_PlayerControllerType的类型非常有用。PlayerControllerType_PlayerControllerType

这只是 Swift 编译器中的一个错误,还是预期的行为?不幸的是,这不再起作用了,因为现在我必须将这些方法放入我所有 PlayerControllers 的新创建的基类中。

任何帮助或反馈将不胜感激。

编辑:这是协议及其扩展的简短示例:

0 投票
1 回答
73 浏览

swift - 对象身份和协议

在 Swift 中是否不可能将对象身份与协议类型进行比较?我正在尝试找到一种内置的方法来做到这一点。这是我的例子:


我收到以下错误:

二元运算符“===”不能应用于“MyProtocol”和“MyProtocolImpl”类型的操作数

0 投票
2 回答
679 浏览

swift - Swift 2.0:创建符合通用协议的对象集合类型

例如:

我想要一个数组,它是一个符合SomeProtocol. 这在理论上似乎很好,但我收到以下错误消息:

不能用作通用约束,因为它包含关联的类型要求。

而且我想这是有道理的,毕竟 Array 也是一个泛型结构,所以编译器将无法弄清楚两者实际上是什么类型,SomeProtocol并且Array都是泛型的。

所以我的问题是——我觉得我应该能够拥有一个符合的对象数组SomeProtocol——这在 Swift 2.0 中是否可行?我是否以错误的方式思考这个问题?

0 投票
1 回答
186 浏览

ios - Protocol in UIView cannot change object in viewController?

I wanted to place a banner in drawRect UIView, but it gives warning at line 'bannerView.rootViewController = self'. So I placed the banner in it's viewController. and I want the value in drawRect to change the banner's position. The value can be printed out, but the banner reject to move. Here is the codes:

ViewController:

UIView:

0 投票
1 回答
188 浏览

swift - 在 Swift 中,Objective-C 类的属性是否可以满足 Swift @obj 协议的计算属性要求?

例如,我想从我现有的 Objective-C 类中提取一个 Swift 协议MyFoo。我们称之为协议FooProtocol

情况如下所示:

然后我应该被允许这样做:

但是我被告知“MyFoo 不符合协议 FooProtocol”。好的。很公平,我猜协议扩展需要一点推动:

但我从编译器中收到看起来像的错误

我究竟做错了什么?

0 投票
2 回答
1027 浏览

swift - 将 self 作为参数传递给希望与 self 相同类型作为参数的协议函数

我正在编写一个异步字典,它返回一个 Future 的值:

  • 如果它已经被缓存,则立即,或者
  • 在(网络)操作之后(如果还没有)

我班级里的字典是通用的,所以班级也是。目前,用户必须阅读文档并知道设置dataCall函数,这就是字典如何知道如何获取键值的方式,形式为

但这需要其他程序员了解数据调用并进行设置。所以我写了一个协议

但是,如果我尝试将其init()称为

delegate.dataCallForCacheManager(self)

我得到错误

无法dataCallForDictionary使用类型为“(CacheManager)”的参数列表调用

我也不能做一个var delegate: CacheDelegate?因为

协议CacheDelegate只能用作通用约束,因为它具有 Self 或关联的类型要求。

因此,我发现自己陷入困境,无法将自己作为参数传递,也无法设置委托来从该协议获取数据调用。我错过了什么吗?我愿意做 Swift 2 Voodoo。

一个玩具示例的内容(没有 Futures 和字典等)如下:

0 投票
1 回答
178 浏览

swift - 实现可散列和重载运算符的协议

我有以下结构:

我想将这些类型作为 Midiplayable 传递给我的播放设备,因为我只需要知道原始值。另外,它们将被放置在集合中,因此 Hashable 是必要的,而且我想比较它们,所以我希望重载运算符 == != < 和 >

我尝试了两种方法(都是免费功能)

导致错误'使用未声明的类型'Self''和

导致错误“协议 'MidiPlayable' 只能用作通用约束,因为它具有 Self 或关联的类型要求”

我该如何解决这个问题?