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

在Swift中实现Set.addSequence

宰父桐
2023-03-14
问题内容

我已经在Swift中实现了一个使用字典键的Set。我想实现一个addAll(sequence)方法,该方法在Set中的Elements上采用任何序列类型,但是出现一个没有意义的错误。这是我的代码

struct Set<Element: Hashable> {
    var hash = [Element: Bool]()

    init(elements: [Element] = []) {
        for element in elements {
            self.hash[element] = true
        }
    }

    var array: [Element] {
        return hash.keys.array
    }

    func contains(element: Element) -> Bool {
        return hash[element] ?? false
    }

    mutating func add(element: Element) {
        hash[element] = true
    }

    mutating func add(array: [Element]) {
        for element in array {
            hash[element] = true
        }
    }

    mutating func add<S : SequenceType where S.Generator.Element == Element>(sequence: S) {
        for element in sequence { // Error here: "Cannot convert the expression's type 'S' to type 'S'
            hash[element] = true
        }
    }

    mutating func remove(element: Element) {
        hash[element] = nil
    }
}

我在XCode 6.1和6.0.1中遇到此错误。

我想遵循Array的extend方法的语义,但是该类型签名甚至不为我编译。

我做错了什么,还是应该提交雷达?

编辑
:刚刚找到https://github.com/robrix/Set/blob/master/Set/Set.swift,它具有以下实现:

public mutating func extend<S : SequenceType where S.Generator.Element == Element>(sequence: S) {
    // Note that this should just be for each in sequence; this is working around a compiler crasher.
    for each in [Element](sequence) {
        insert(each)
    }
}

但是,这只是转换sequenceArraySequenceType完全违反了目的。


问题答案:

更新: 这已在Swift 1.2(Xcode 6.3 beta
3)中修复,问题中的原始代码可正确编译。(此外,不再需要定义自定义集合类型,因为Swift 1.2具有Set内置的本机类型。)

旧答案: 对我来说,这似乎是个错误,但也许有人可以解释。

可能的解决方法:

  • sequence参数SequenceOf<Element>显式转换为:

    mutating func add<S : SequenceType where S.Generator.Element == Element>(sequence: S) {
    for element in SequenceOf<Element>(sequence)  {
        hash[element] = true
    }
    

    }

  • 使用next()序列生成器将while循环替换为while循环,并使用显式注释元素element : Element

    mutating func add<S : SequenceType where S.Generator.Element == Element>(sequence: S) {
    var gen = sequence.generate()
    while let element : Element = gen.next() {
        hash[element] = true
    }
    

    }

  • (摘自“在Swift中创建集合类型”)使用map

    mutating func add<S : SequenceType where S.Generator.Element == Element>(sequence: S) {
    map(sequence) {
        self.hash[$0] = true
    }
    

    }



 类似资料:
  • 问题内容: 我正在使用iOS的Google Maps API,并想使用标记聚类实用程序。我想出了如何显示聚簇标记,但是我想自定义标记。有人可以解释如何设置/更改每个标记或群集标记的图标和标题吗?示例代码将非常有帮助。 到目前为止,这就是我所拥有的。我不知道该如何处理renderClusters和更新函数。 问题答案: 在 Swift 4上 ,我找到了一种针对聚簇标记的干净解决方案,可以为聚簇使用自

  • 问题内容: 我最近开始使用Swift来构建OS X应用程序,我想知道如何实现拖放区域。 更具体地说,我构建了一个处理图像的应用程序,但目前,用户必须手动输入输入图像的路径或使用文件选择器(这很烦人)。我想改进我的应用程序,允许用户通过简单的拖放输入图像(我只需要检索表示图像路径的String即可)。 我怎样才能做到这一点? 问题答案: 这是我在应用程序中使用的示例。 如有必要,将一致性添加到子类声

  • 问题内容: 我一直在尝试使它工作一段时间,而我来这里询问-如何在Swift中使用CLLocationManagerDelegate方法?我把它放在班上的第一位: 我在我的方法中添加了以下内容: 而且我尝试使用这些委托方法无济于事: 我也尝试过在函数前面使用@optional,但是Xcode会引发编译器错误。有任何想法吗? 问题答案: 如果尚未添加,则需要将或键添加到您的plist中,因为它们现在是

  • 问题内容: 我正在尝试将我的应用程序转换为Swift语言。 我有这行代码: 如何将其转换为Swift? 在Apple的文档中,没有这种方法。 问题答案: iOS 9更新: 如果您的目标是iOS 9+(从Xcode 7 b1开始),则协议中有一个不使用varargs 的新方法: 可以这样使用: 如果您仍然需要支持iOS 8或更早版本,请使用以下原始答案回答此问题。 对于iOS 8和7: 这些方法不适

  • 问题内容: 问题 注释 我在计算范围中的元素数量等时遇到问题… 问题答案: 范围中的值是,因此您只能使用它们或计算,但是未定义减法。预付款必须是相应的类型。因此,这可能是一种实现: 例: 但是请注意,这不是整数列表(或数组)。要将 数组 拆分为子 数组 ,可以定义类似的扩展名: 例: 一种更通用的方法是拆分所有 可切片 对象。但 是 协议 和协议不能扩展。你可以做的反而是定义一个 函数 ,是以可切

  • 问题内容: 考虑两个类。第一个是,其子类符合: 第二类继承自: 该代码无法编译,因为: 使用元类型值构造“ Vehicle”类类型的对象必须使用“ required”初始化程序。 因此,我继续添加所需的初始化程序: 现在,应用程序可以编译,并且对象可以正确响应。 两个问题: 为什么构造具有元类型的对象需要初始化程序?(看来我编写的初始化程序没有任何作用。) 我写错了什么,还是 应该 添加到初始化程