问题标签 [swift-extensions]

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 回答
345 浏览

generics - 在 swift 2.0 中使用符合协议的元素扩展数组

我正在尝试为 Array 结构创建扩展,以便在包含的对象符合特定协议的情况下添加方法,但是当我尝试从类访问扩展中的方法时,我遇到了奇怪的行为。

这是我的游乐场代码

知道有什么问题吗?

0 投票
1 回答
210 浏览

swift - 具有特定类型元素的 CollectionType 扩展忽略子类型

我正在尝试为包含某种 FooType 类型元素的集合类型创建一个扩展,这很好用:

我的问题是我还希望此扩展适用于包含 Foo 类的子类的集合类型:

我可能会覆盖“==”运算符并遍历超类链,直到找到匹配项,但不确定这是否是正确的方法。

我是否在 where 子句中遗漏了可以解决此问题的内容,还是我做错了?

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 回答
188 浏览

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

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

情况如下所示:

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

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

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

我究竟做错了什么?

0 投票
2 回答
9374 浏览

swift - Swift 扩展:两个模块中的相同扩展功能

假设我有一个名为 SwiftKit 的框架,它有一个名为 someClassMethod 的 UIView 扩展类方法和一个名为 someProperty 的属性:

而且我还有一个叫 SwiftFoundation 的框架,它里面还有一个 UIView 的扩展类方法叫 someClassMethod 和一个叫 someProperty 的属性:

然后我创建了一个项目来介绍这些框架,事情是,如果我将它们都导入同一个 swift 文件并访问这些扩展,我得到一个“模糊使用 someProperty/someClassMethod()”错误,即使我指定了调用SwiftKit.UIView.someClassMethod() 的形式:

如果我只导入其中一个,模棱两可的错误就会消失,但会发生更奇怪的事情:

控制台打印出来:

来自 Swift 基金会的 someProperty

来自 Swift Foundation 的 someClassMethod

我的问题是:我怎样才能毫不含糊地调用这些扩展(类/实例方法、属性)?如果我不能,这是否意味着我们应该像通常使用 Objective-C 一样为扩展名添加前缀?

0 投票
1 回答
1990 浏览

swift - 使用键和值约束扩展字典

我想扩展字典并将其限制为具有类型值的 NSDate 的特定键类型Array<MyClass>

MyClass 是一个没有子类的 swift 类。

上面的代码返回一个构建错误:

类型“值”限制为非协议类型“数组”

好的,所以它似乎需要被限制到一个特定的协议,但奇怪的是,当我将 Value 限制为:

扩展字典,其中键:NSDate,值:MyClass

编译器不会抱怨并且构建成功。但是 MyClass 不是协议。那么给了什么?

我设法像这样限制它:

但这需要强制转换,因为我需要以整数形式获取 count 属性。

那么为什么我不能将它明确地限制为 [MyClass] 的值类型呢?

0 投票
1 回答
1261 浏览

swift - 为什么 Swift 不允许在扩展中存储属性?

我一直在尝试找到在扩展中实现存储属性的最佳方法,并遇到了这个问题:Swift extension stored properties alternative。但是,我在讨论或其他任何地方都没有找到原因。Swift中不允许存储属性是否有原因?如果是这样,原因是什么?

0 投票
1 回答
375 浏览

ios - 如何使用创建可放置在不同位置的 UIView 的函数创建扩展?

我必须创建一个自定义 UIView,它实际上是一个具有相同大小和外观的圆圈,放置在视图中的不同位置。我创建了一个适用于一个圆圈的扩展,但我想使用相同的功能将圆圈放置在不同的位置。这是我的扩展:

这就是我调用扩展的方式:

现在我想做的是这样的:

我的帮助提示类如下所示:

我想对上述圆圈使用具有不同约束的相同扩展,因为它被放置在视图中的不同位置。任何帮助表示赞赏。谢谢!

0 投票
3 回答
3827 浏览

swift - 扩展 UICollectionViewDataSource 协议以添加默认实现

我有一个相当大的应用程序,它有很多集合视图。大多数集合视图对数据源和流布局委托具有相同的实现(相同的大小、边距等)。我正在尝试创建一个提供 UICollectionViewDataSource 和 UICollectionViewDelegateFlowLayout 的默认实现的协议。这是我的代码。

问题是,编译器抱怨 MyViewController 不符合 UICollectionViewDataSource。这不应该是这种情况,因为我明确表示如果类型是 TiledCollectionView,则添加默认实现。

有人可以帮忙吗?

0 投票
1 回答
428 浏览

swift - Swift 协议扩展中的“关联类型”难以理解

我正在努力快速理解协议和协议扩展。

我想定义一系列可应用于类的协议,以及一组协议扩展以提供默认实现。示例代码:

扩展中的上述覆盖函数rawValue()给出了错误Ambiguous type name 'ResultType' in 'Self'。如果我Self从 中删除,Self.ResultType我会收到错误消息'ResultType' is ambiguous for type lookup in this context

如何向协议扩展发出信号,使用哪种类型ResultType

我的目标是能够将协议及其扩展应用于一个类,如下所示:

以便:

如果我完全不了解协议扩展如何提供默认实现,那么我对如何实现相同结果持开放态度。