首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >两种协议的协议类型约束

两种协议的协议类型约束
EN

Stack Overflow用户
提问于 2015-12-15 20:28:16
回答 1查看 119关注 0票数 0

我在下面的斯威夫特2中设置了两个协议

  • 生成(因为没有更好的名称),它包含一个项数组,并提供类似于Datasource的功能,如计数和下标。
代码语言:javascript
复制
public protocol Generative {
    typealias GeneratedType

    var elements: [GeneratedType] { get }
}

public extension Generative {
    func count() -> Int {
        return elements.count
    }

    subscript(index:Int) -> GeneratedType? {
        if index >= count() {
            return nil
        }
        return elements[index]
    }

}

public protocol Selectable {
    typealias SelectableType: Hashable

    var selectedElements: Set<SelectableType> { get set }

}

extension Selectable {
    public func isSelected(elem: SelectableType) -> Bool {
        return selectedElements.contains(elem)
    }

    public mutating func addSelection(elem: SelectableType) {
        selectedElements.insert(elem)
    }

    public mutating func removeSelection(elem: SelectableType) {
        selectedElements.remove(elem)
    }

    public mutating func clearSelections() {
        selectedElements.removeAll()
    }
}

因此,如果一个对象实现了生成性和可选性,那么我希望它能够返回所选的索引,因此我编写了以下函数:

代码语言:javascript
复制
func selectedIndices<S: Selectable where S: Generative, S.GeneratedType == S.SelectableType>(ds: S) -> [NSIndexPath] {
    var selections: [NSIndexPath]  {
        return ds.selectedElements
            .map{ (p: S.GeneratedType) -> NSIndexPath? in
                if let idx = ds.elements.indexOf(p) { idx
                    return NSIndexPath(forRow: idx, inSection: 0)
                }
                return nil
            }
            .filter{ $0 != nil }
            .map{ $0! }
    }


    return selections
}

由于某种原因,链接器打印出:

由于信号导致命令失败:分段错误: 11

不知道为什么,我想不出另一种方法来指定此函数来处理实现协议及其关联类型匹配的对象.有什么想法吗?

地址: Gist:https://gist.github.com/edwardIshaq/715b0e134fb47d2e28cc中的代码

-更新删除计算机属性似乎有效:

代码语言:javascript
复制
func selectedIndices<S: Selectable where S: Generative, S.GeneratedType == S.SelectableType>(ds: S) -> [NSIndexPath] {
    return ds.selectedElements
        .flatMap { (p: S.GeneratedType) -> NSIndexPath? in
            if let idx = ds.elements.indexOf(p) { idx
                return NSIndexPath(forRow: idx, inSection: 0)
            }
            return nil
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-15 21:59:55

编译器不应该崩溃,但原因似乎更简单,似乎与在内部使用计算属性的泛型函数有关,这是我所能得到的最简单的:

代码语言:javascript
复制
// swiftc crashes when compiling this
func f<T>(t: T) -> Int {
    var v: Int {
        return 0
    }
    return v
}

因此,作为解决办法,尝试重构代码以避免使用计算属性。

您可以这样做,并将其编写为两个协议的扩展,如下所示:

代码语言:javascript
复制
extension Selectable
where Self: Generative, 
      Self.GeneratedType == NSIndexPath, 
      Self.SelectableType == NSIndexPath 
{
    func selectedIndices() -> [NSIndexPath] {
        return self.selectedElements.flatMap {
            self.elements.indexOf($0).map { NSIndexPath(index: $0) }
        }
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34298772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档