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

swift - 我可以从协议扩展的类型直接访问默认静态变量吗?

为了 Swift 的乐趣,我想我会为GCD. 所以我把它扔进了操场:

但这会在最后一行产生错误:

我不确定这是在告诉我什么。我的意思是,我读过它。但我没有看到真正的问题。我查看了Doublevar 之类的类型是如何使用的NaN,但我不确定为什么我不能使用类似的访问器扩展另一种类型。

(我确实尝试过没有 的替代品typealias,没有区别)

更新:@Kametrixom 的回答没有立即帮助,但它最终可能有所帮助。这是我必须做的才能让灯泡亮起来。

好的,这有效,现在是一个结构。

那也奏效了。现在是具有扩展默认实现的协议:

但是,使用协议扩展类或结构:

那行得通。我犯的错误(我认为?)是假设有一个 Humble 类型的第一类实例,它附有该行为,我可以调用它,ala 组合样式。相反,它只是添加到结构/类类型的行为模板。

我已经更改了问题的标题。答案是否定的。

0 投票
2 回答
1850 浏览

swift - Add constraints to generic parameters in extension

I have this function:

As you can see, it transforms a [Key: Value?] dictionary into a [Key: Value] one (without the optional).

I wanted to extend the Dictionary class with a new method only for classes which value is an Optional of any type, but I am unable to add constraints to the generic parameters of the dictionary.

This is what I tried:

But fails with error:

0 投票
1 回答
810 浏览

objective-c - Cocoapods 框架中的 Swift 扩展导致无法识别的选择器发送到类

我有一个 Swift 框架,它通过 Cocoapods 进行管理,并包含如下扩展:

当我在我的主应用程序中用 Objective C 编写它时,我没有收到编译器错误或警告。

但是,当我运行该应用程序时,它会爆发出一堆“无法识别的选择器”错误。

奇怪的是,当框架包含项目中并直接添加到构建阶段的相关部分(即不由 Cocoapods 管理)时,一切都按预期工作。

框架的其他方面——类、枚举等——也都可以正常工作,它似乎只是扩展并且只有当它们位于由 Cocoapods 管理的框架中时。

关于我可能在这里遗漏的任何想法?

0 投票
1 回答
947 浏览

swift - 两个不同模块中的相同类扩展

我的项目中有一个框架,它实现了 NSDate 的扩展。扩展看起来像这样。

我已将此框架导入到应用程序项目中。现在,如果我将相同的扩展名复制并粘贴到应用程序中的 swift 文件中,我的应用程序代码中的新副本似乎会覆盖框架代码中的副本。

当我在我的应用程序中调用这个函数时,有没有办法可以使用命名空间来指定我想要的实现?

0 投票
2 回答
12260 浏览

ios - Self.Type 不能直接转换为 AnyClass 以扩展为 swift 中的objective-c 类

我正在尝试创建结构方法来创建具有正确 nib 名称的 UIViewController(以修复 iOS8 默认初始化程序问题)。为此,我添加了扩展名:

但是编译器发出错误:Cannot convert value of type 'Self.Type' to expected argument type 'AnyClass' (aka 'AnyObject.Type')NSStringFromClass(self).

要修复它,可以添加另一种扩展方法并将代码重写为:

但是我想了解第一个变体的问题。

据我了解,方法返回Self是一种通用方法。Self可以在许多上下文中使用(例如类、结构、协议等),但仅Self.Type匹配AnyClass类。

在我的情况下,编译器应该知道Self引用UIViewController及其所有子类(因为它在UIViewController扩展内部),所以Self.Type必须可以转换为AnyClass.

我是否遗漏了什么,或者这是正确的行为,因为编译器不执行任何额外的类型分析Self

0 投票
3 回答
1227 浏览

swift - 试图扩展 IntegerType(和 FloatingPointType);为什么不能将所有 Int 类型都转换为 NSTimeInterval

(这可能需要一个更好的标题......)

我想要一组可以在代码中使用的访问器来快速表达持续时间。例如:

这篇文章说明了你不能只用一个简单的新协议、扩展和强制来做到这一点IntegerTypeFloatingPointType采用它。所以我想我会走更冗余的路线,直接扩展IntegerType(然后重复代码FloatingPointType)。

产生的错误令人困惑:

让我困惑的是,它似乎说我不能用 (Self) 做一个 NSTimeInterval() 初始化程序,但是 Self 表示的所有内容都列在下一行,它显示了 NSTimeInterval 的所有可能的初始化程序。我在这里想念什么?

旁白:如果有一篇写得很好的关于 Swift 类型系统和做这些事情的教程,我会很高兴的。Apple 稀疏的 Swift 文档没有很好地涵盖中级/高级的内容

更新/澄清

我想要的是能够评估上述任何表达式:

此外,我希望这些的返回类型为 NSTimeInterval(Double 的类型别名),例如:

我知道我可以通过简单地扩展来实现这一点,Double因此Int

但我也希望以下表达式起作用:

不过这行不通,因为我只扩展了Int,而不是UInt。我可以冗余地扩展Uint,然后UInt16,然后Int16,等等......

我想概括 to 的扩展,IntIntegerType原始清单所示,这样我就可以获得所有整数类型的一般转换。然后对FloatingPointType而不是专门做同样的事情Double。但是,这会产生原始错误。我想知道为什么我不能像通常所示的那样扩展 IntegerType。除了列表中显示的之外,是否还有其他IntegerType采用者使得 NSTimeInterval() 初始化程序无法解析?

0 投票
2 回答
8774 浏览

ios - UIView 的扩展

我的代码是用 Swift 2.0 编写的,部署目标是 iOS 8.0 或更高版本。我正在尝试扩展 UIView 以便UIView.animateWithDuration()我可以使用我的自定义函数而不是使用。我想取一个UIView圆形并保留它,使其角半径保持其高度和宽度的一半,但填充一个正方形。因此,UIView应该以当前形状扩展,直到达到矩形边界。我想在 UIView 上使用扩展。如下。

有效的代码是。

0 投票
1 回答
161 浏览

swift - 协议扩展类型 Self 与初始值设定项类型不匹配

假设出于学术目的,我更喜欢这样的表达

而不是股票

由于所有各种 Swift 整数类型都符合IntegerType协议并且因为似乎有一个Double()初始化器适合所有类型的 int 类型,所以我想我可以这样:

这不起作用。我想知道为什么?我想知道是否有一些魔法可以使它起作用?一个where也许?还是与self参考有关?

我在此尝试的操场控制台中遇到的错误如下:

0 投票
1 回答
729 浏览

arrays - 带有选项的 Swift 数组扩展

我为 Array 创建了简单的扩展,它只会附加唯一的元素。在我想使用一系列选项之前,它工作正常。既然我不断收到错误 Type 'Event?' does not conform to protocol 'Equatable'

事件类

扩大

用法

问题 我不明白这种情况。Event类符合该协议。我也尝试过添加其他==功能组合,但没有成功。

我不知道如何看待这个问题。是我延期的问题吗?我应该如何正确处理它?你能告诉我正确的轨道吗?

0 投票
2 回答
640 浏览

swift - Swift:通用协议

我有一些 swift 结构,它们的协议合规性是通过具有相同方法名称的单个扩展生成的,这些扩展的返回类型不同,它们依赖于结构。最重要的是,我想在一个泛型函数中使用它们,该函数为泛型类型调用符合协议的函数)。我试图这样做: //: Playground - 名词:人们可以玩耍的地方

不幸的是,我收到以下错误:/var/folders/sn/78_zvfd15d74dzn01mdv258h0000gq/T/./lldb/3741/playground6.swift:7 :17:注意:协议需要函数 'createMe()' 类型为 ' () -> T ' (又名'<τ_1_0> () -> τ_1_0') 静态函数 createMe()->T;

这里到底有什么不符合的,是否有解决方法?