当前位置: 首页 > 面试题库 >

是否可以在Swift中进行仅限于一类的Array扩展?

谭云瀚
2023-03-14
问题内容

我是否可以制作仅适用于字符串的Array扩展?


问题答案:

从Swift 2开始,这可以通过 协议扩展 来实现,该 协议扩展 为符合类型的类型(可选地受其他约束限制)提供方法和属性实现。

一个简单的例子:为所有符合SequenceType(例如Array)的类型定义一个方法,其中sequence元素为String

extension SequenceType where Generator.Element == String {
    func joined() -> String {
        return "".join(self)
    }
}

let a = ["foo", "bar"].joined()
print(a) // foobar

不能struct Array直接为扩展方法定义扩展方法,而只能为符合某种协议(带有可选约束)的所有类型定义扩展方法。因此,必须找到一种协议,该协议必须Array遵循并提供所有必要的方法。在上面的示例中,即SequenceType

另一个示例如何将元素的正确位置插入Swift的排序数组中?:

extension CollectionType where Generator.Element : Comparable, Index : RandomAccessIndexType {
    typealias T = Generator.Element
    func insertionIndexOf(elem: T) -> Index {
        var lo = self.startIndex
        var hi = self.endIndex
        while lo != hi {
            // mid = lo + (hi - 1 - lo)/2
            let mid = lo.advancedBy(lo.distanceTo(hi.predecessor())/2)
            if self[mid] < elem {
                lo = mid + 1
            } else if elem < self[mid] {
                hi = mid
            } else {
                return mid // found at position `mid`
            }
        }
        return lo // not found, would be inserted at position `lo`
    }
}

let ar = [1, 3, 5, 7]
let pos = ar.insertionIndexOf(6)
print(pos) // 3

此处将方法定义为的扩展,CollectionType因为需要下标访问元素,并且元素必须是Comparable



 类似资料:
  • 在可能的副本上: 此线程不是在询问如何扩展类。它问为什么一个声明为的类可能会扩展另一个类。 从该线程: <code>final</code>类只是一个不能扩展的类。 但是,我有一个帮助程序类,我声明它是,并了另一个类: Eclipse没有检测到任何错误。我已经测试了这个类,并且PDF是成功生成的,没有错误。 为什么我能够课程,而理论上我不应该延长? (如果重要的话,我正在使用Java7。)

  • 问题内容: 是否可以仅针对XHR请求限制Symfony 2路由?我想声明只能通过AJAX访问的路由。 我不想像这样在每个AJAX特定操作中添加一些额外的行: 我想定义: AJAX请求的一条规则 对相同URL进行GET / POST请求的一条规则 为了避开上述情况。 问题答案: 我知道这个问题有点老,但是与此同时 ,Symfony 2.4* 中引入 了 一种 新的解决方法 。 * 匹配表达式 对于a

  • 问题内容: 我想扩展以增加对新协议的一致性-但仅适用于其元素本身符合特定协议的数组。 更笼统地说,我想让带有类型参数的类型(无论是协议类型还是具体类型)仅在类型参数与某些约束匹配时才实现协议。 从Swift 2.0开始,这似乎是不可能的。有什么我想念的方式吗? 例 假设我们有以下协议: 我们可以扩展现有的类型来实现它: 我们还可以扩展实现其所有元素时的实现: 在这一点上,类型本身应该实现,因为它符

  • 我试图用vba做一个按钮来删除Excel表中的一行,但当我按下按钮并选择不止一行或许多单元格时,我想限制从E到I的选择(和行的数量无关)这里是我的代码,非常感谢,希望你能帮助我,我还没有找到任何类似的东西。

  • 问题内容: 我有一个vpn连接,当我运行python -m SimpleHTTPServer时,它在0.0.0.0:8000上提供服务,这意味着可以通过本地主机 和 我的真实IP访问它。我不想让机器人扫描我,并且对仅通过本地主机访问服务器感兴趣。 可能吗? 也欢迎任何其他可以使用命令行立即执行的简单http服务器。 问题答案: 如果您阅读了源代码,您将看到只能在命令行上覆盖端口。如果你想改变它在服

  • 问题内容: 我不确定如何更清楚地表达我的问题。基本上,PyPlot是否限于一个实例/窗口?我尝试的任何破解或变通办法要么导致程序冻结,要么使第二个pyplot窗口排队,直到第一个关闭。 问题答案: 当然,只需打开一个新图即可: 如果您在默认的python解释器中运行此命令,则此命令将无效,因为每个图形都需要输入gui的mainloop。如果要在交互式shell中运行事物,请查看IPython。但是