问题标签 [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 回答
980 浏览

arrays - 协议实例数组不适用于包含方法

我有一个协议,用于定义构成笔记内容的内容。一个便笺可以有许多不同的内容类型,因此协议似乎是最好的方法。

然后我有该协议的实现

这是两个对象的简化示例。接下来我有一个Note包含协议实现Array的类。Content

我遇到的问题是,当我这样做时

编译器告诉我

Note.swift:21:12:找不到接受类型为“([内容],内容)”的参数列表的“包含”的重载

我在Stackoverflow上查看了一些示例,并且正在按照他们的说明进行操作。我如何定义协议以便将其用作数组和相关的全局函数是否存在问题?

编辑

我还尝试使协议继承自Equatable,此时我收到以下编译器错误

协议“内容”只能用作通用约束,因为它具有自身或相关类型要求

对于如何对协议数组执行相等性检查,我有点困惑。这是 Swift 不支持的东西吗?我来自 C# 背景,所以不确定 Swift 如何完全处理协议。

0 投票
1 回答
110 浏览

swift - 字典不符合 ExtensibleCollectionType

Swift 中的字典不符合ExtensibleCollectionType. 因为它很容易扩展(它在某种程度上不适用于 Swift 1.2;使用 Swift 2):

如果这样做,还可以添加字典(另请参阅:添加序列类型

在标准库中不实现这个有什么好处吗?

0 投票
1 回答
1683 浏览

swift - swift2中协议扩展和默认值的限制

所以我在玩协议扩展时遇到了一个“有趣”的问题。

我想写一个MetersKilometers单位类型来测试一些东西。作为一个有基类并且两个子类都覆盖基类的类,它很容易做到这一点,而只是覆盖一个简单的值

所以你可以看到我有很多重复的代码(特别是初始化程序)

我试图做一个协议扩展来设置默认初始化程序

但是在初始化之前我得到了一个通过引用传递的变量'self'的错误

有什么办法可以让它工作还是我只需要输入很多重复的代码?也许使用unsafe或什么?

0 投票
2 回答
1568 浏览

protocols - 在 Swift 中执行协议的默认实现时,实现默认属性的正确方法是什么?

我对 Swift 中面向协议编程的概念非常着迷,因此,我将去年创建的一个旧项目(最初是一个 OOP 框架)迁移到 POP。

在这个阶段,我遇到的问题可能是因为我对 POP 的理解不正确,或者 Swift 2.0 Beta 没有创建一个真正面向协议的框架的一切(不太可能 - 如果有的话我可能会误解POP 的某些方面)。

面向协议的编程是不到一个月前向世界介绍的一种全新的编程范式,因此关于它的书面内容并不多(我在该主题上找到的唯一教程并没有解决我遇到的问题,并且WWDC 视频也没有)。

无论如何,直截了当:我要么在这里做错了,要么面向协议编程的缺点之一是你必然会重复很多代码。一个例子:

我有以下协议,它具有许多属性并且也符合Equatable协议:

在我的框架的原始版本中,这个协议是一个名为 的类Media,以及从它继承的另外两个类。所以他们免费获得了所有这些房产。

但看起来我不能为符合该协议的对象提供这些属性的默认实现(即 getter)?

我尝试的第一件事是简单地将协议提供给我的结构声明,但失败了,这是意料之中的,因为我没有为属性提供任何实现:

这失败了:

类型“Anime”不符合协议“MediaType”

我的下一个尝试是为 MediaType 编写一个扩展,并将属性放在那里:

这没有用:

扩展可能不包含存储的属性。

它有一个我真的不喜欢的缺点:我已经在复制代码,将协议的属性复制到扩展中。

所以最后,我永远无法让我的属性“传播”到符合协议的对象,所以我最终将属性添加到Anime结构中。

这似乎奏效了。MediaType但现在我在和中都有我的属性Anime。在 OOP 中,您可以通过子类化来避免重复代码。

所以我在这里重复我的问题:我是不是误解了面向协议的编程,或者是 POP 的缺点是你必须在使结构/类/枚举符合它时复制和粘贴特定于协议的逻辑?

0 投票
2 回答
359 浏览

ios - 在前一个视图控制器中调用委托方法和更新 UI 时出现问题

我想使用委托方法从当前视图控制器更新我的顶视图控制器中的一些 UI。我收到错误消息unexpectedly found nil while unwrapping an Optional value。请查看以下代码并提出问题所在。

第一个视图控制器

第二个视图控制器

0 投票
1 回答
328 浏览

swift - Swift:将泛型类型限制为闭包

如何将泛型类型限制为闭包?像这样:

0 投票
2 回答
790 浏览

swift - 带有 where 子句的 Swift 数组扩展不适用于子协议

我编写了一些我认为应该在 Swift 2 (Xcode 7b4) 中工作的代码,但它没有编译。我希望对我正在尝试做的事情是否有效有一些想法。

考虑这个示例Array扩展:

首先,元素为 的数组是什么意思AnyObject?基本上我是说数组应该包含一组异构的非值类型对象,可以比较例如相等(===)。

示例函数appendUniqueInstance()仅将元素插入到数组中(如果它不在数组中)。这类似于Set insert()操作,但显然提供了排序并且(更重要的是)不强加Set' 的同质类型要求(通过Equatable' 的使用Self)。

如果我现在定义一个协议P和一个C实现的类P

并实例化一个C

let c = C()

那么这些非常明显的事情是真的:

我现在可以执行以下操作:

到目前为止,一切都很好,但现在对于问题案例:

在这里,a2被键入为 的数组,因此对的实例P执行此操作应该是完全有效的,并且确实该行按我们预期的那样工作。appendPa2.append(c)

然而,调用Array扩展函数会appendUniqueInstance()产生编译器错误。

据我所知,编译器似乎对可以传递的内容感到困惑,appendUniqueInstance()而没有意识到(或由于某种原因允许)C(via P) 是一个AnyObject.

顺便说一句,如果我P改为声明:

@objc protocol P : AnyObject {}

然后一切都编译得很好,但我还必须确保协议中的所有内容都P符合@objc,这不是我想要的。

所以,在这一切之后,我的问题是:这看起来应该可行吗?我希望这不仅仅是一些声明语法错误的情况,但我想如果是这样我会很高兴。

0 投票
2 回答
4519 浏览

swift - Swift 中没有调用委托方法?

我想在没有 segues 帮助的情况下将 Bool 值从视图控制器传递到另一个。所以我推荐并得到了代表。

我已经在我的应用程序中应用了代表。但是没有调用 Delegate 方法。我不知道我在哪里犯错误。

所以请帮助我。

主视图控制器

第二个视图控制器

0 投票
3 回答
14143 浏览

swift - 协议中的嵌套类型

可以在协议中声明嵌套类型,如下所示:

Xcode 说“此处不允许输入”

类型“NameOfClass”不能嵌套在协议“嵌套”中

我想创建一个需要嵌套类型的协议。这是不可能的,还是我可以用另一种方式做到这一点?

0 投票
1 回答
614 浏览

swift - 为什么我的简单协议只能用作通用约束?

我正在尝试做一些用于依赖注入的协议组合,但我遇到了一个问题,我怀疑可能没有我想要的解决方案,但我看不到逻辑原因:

上面的代码在实例变量和实例化参数上导致错误“协议'RT'只能用作通用约束,因为它具有自身或关联的类型要求” 。我真的不明白为什么我不能在课堂上使用这个通用要求。rtJamesJames

我最初做了如下的事情:

但这失败了,因为“类型'Bob'不符合协议'VM1' ”(和VM2)我可以理解,因为我的协议要求变量是特定协议类型而不是某些符合该协议的实例类型协议。因此,上述版本旨在解决此问题。

有没有人对我想做的事情有解决方案(能够通过将一个同时符合and的具体结构RT作为dm属性来制作符合的具体结构)?DM1DM2