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

java - Swift“扩展”的Java等价物是什么?

根据官方 Swift 文档(Swift extension doc),Swift 扩展看起来像 Java 枚举。

我试图用 Java 来表示这一点,并提出了以下代码。这个 Java 表示是否正确?还是有任何其他方式来表示这一点?

0 投票
2 回答
376 浏览

swift - 静态协议扩展生成非法指令编译器错误

我已经阅读了 Swift 中可用的扩展,想知道是否支持静态protocol extensions?我知道实例方法可以在protocol extension.

我想为我的存储库创建一个协议,以及该存储库的实现:

存储库协议

存储库实现

然后为了在我的应用程序中保持松散耦合,我想通过工厂创建存储库。我试图变得聪明,并将静态方法附加到我的协议中,如下所示:

我知道如果我把static关键字放在这里可以做到这一点,但我真的希望它是静态的,所以我可以这样做:

现在,当我想更改我的存储库实现时,我可以通过更新我的协议扩展工厂方法来做到这一点。另一种选择是创建一个实际的工厂来处理这个问题,但我喜欢类型本身存在工厂方法的想法。

当我编译这个时,我得到以下编译器错误:

由于信号而命令失败:非法指令:4

警告:不可变值“存储库”的初始化从未使用过;考虑用赋值替换'_'或删除它 let repository = NoteRepositoryProtocol.createInstance() ~~~~^~~~~~~~~~ _ not existential UNREACHABLE 在 /Library/Caches/com.apple.xbs/ 执行来源/swiftlang/swiftlang-700.0.38.1/src/swift/lib/SILGen/SILGenExpr.cpp:3311!0 swift 0x0000000106760e0b llvm::sys::PrintStackTrace(__sFILE*) + 43 1 swift 0x000000010676154b SignalHandler(int) + 379 2 libsystem_platform.dylib 0x00007fff9440ef1a _sigtramp + 26 3 swift 0x0000000106d5aa2e FirstTarget + 60550 4 swift 0x0000000106761346 abort + 22 5 swift 0x000000010671ae21 llvm: :llvm_unreachable_internal(char const*,

你不能在协议扩展中使用静态方法吗?

更新

我删除了单元测试断言以改善示例源中的问题根源。问题是编译器不喜欢我在协议上调用静态方法。

0 投票
1 回答
3735 浏览

ios - 使用 IBInspectable 选择状态的 UIButton 边框颜色

我正在使用这样的 Swift 扩展@IBInspectable来设置边框颜色:UIButton

...但我也想拥有一个按钮状态的selectedBorderColor属性。.Selected像这样的扩展有可能吗?我是否必须以UIButton某种方式进行子类化并检查按钮状态?

提前致谢。

0 投票
1 回答
293 浏览

swift - 扩展函数要求返回类型而不是参数

我正在 Swift 中创建 UIFont 的扩展,它将返回自定义字体。

但是,当我使用扩展时,self.titleLabel?.font = UIFont.museoSansRounded900(15.0)Xcode 在设计时返回错误说'(CGFloat) -> UIFont' is not convertible to 'UIFont'

难道我做错了什么?当我使用扩展中的函数时,Xcode 实际上要求 UIFont 作为参数而不是 CGFloat。

在此处输入图像描述

0 投票
4 回答
34896 浏览

swift - 如何在协议扩展中定义初始化器?

在 self.wheels = 轮子上我得到了错误

如何在协议扩展中定义初始化程序?

0 投票
1 回答
1049 浏览

ios - Swift:当我们对 Int 进行扩展时,属性 getter 中的“self”应该是什么?

似乎这是一个错误并在 Xcode 7 中使用 Swift(2b3) 解决

为了方便观察,我们把代码贴到playground,结果会在评论中说明。

我的问题是,如果self在属性的 gettersq中指的是整数本身,为什么在做n之后保留 5 n.sq

让我们看看如果我们只添加一个 setter 会发生什么:

那么,案例上部的问题是什么?

顺便说一句,在这种情况下,实现类似的函数sq()会更合理,并且已经证明,但我只想知道为什么它在属性 getter 中不起作用。

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 投票
1 回答
37 浏览

swift - 带有接收值的扩展

我正在快速学习扩展,我想为String类似命令创建一个扩展.hasPrefix(),在该命令中我们发送一个字符串,为了测试它我试试这个代码:

但不工作,我想做的就是创建一个扩展,我们可以发送其他值,比如.hasPrefix(在里面发送一个字符串).hasSufix(也发送一个字符串),我该怎么做?

0 投票
8 回答
32390 浏览

swift - 在 Swift 中使用 where 子句扩展数组类型

我想使用 Accelerate 框架来扩展 [Float] 和 [Double],但它们中的每一个都需要不同的实现。

我尝试了明显的:

并得到这个错误:

“必须在非专用泛型类型 'Array' 上声明约束扩展,并使用 'where' 子句指定约束”

是否可以以这种方式在 Swift 2 中扩展泛型类型?

我现在已经让代码按预期工作了。下面是一个使用 Accelerate 框架进行求和的示例。

0 投票
1 回答
189 浏览

ios - 复杂的 Swift 扩展

我想在 Swift 中为 String 类创建一个扩展,它允许您像在 Python 中一样通过下标运算符获取子字符串。这可以通过 Range 类通过以下方式完成

这启用了以下用法

但是,我希望能够使用负整数从结尾和开头索引字符串。

由于 Range 类不允许startIndex大于endIndex上述扩展,因此不足以实现此行为。

由于 Range 对象显然不能用于此扩展,因此简单地使用与 Python 中相同的语法对我来说是有意义的

这可能吗?我该怎么做呢?