0

当我尝试编译以下代码时出现分段错误。我正在尝试对CellUpdater结构进行类型约束扩展,它访问一个属性,该属性的类型是在泛型类型的关联类型上定义的。不确定我是否做错了什么,或者它是否是 Swift 编译器的限制,有什么想法吗?

protocol CellUpdaterType {
    func generateDetailsDrillDownController(index: Int) -> UIViewController?
}

extension CellUpdaterType {
    func generateDetailsDrillDownController(index: Int) -> UIViewController? { return nil }
}


struct CellUpdater<Cell where Cell: UpdatableView> : CellUpdaterType {
    let viewModel: Cell.ViewModel
}

extension CellUpdater where Cell: HeadlineCell {
    func generateDetailsDrillDownController(index: Int) -> UIViewController? {
        let storyboard = UIStoryboard(name: "SomeStoryboard", bundle: nil)
        let vc = storyboard.instantiateViewControllerWithIdentifier("SomeViewController") as? SomeViewController
        vc?.headline = viewModel.headline // This line crashes the compiler
        return vc
    }
}

class HeadlineCell: UITableViewCell {
    var headline: Headline?
    // ...
}


extension HeadlineCell : UpdatableView {
    typealias ViewModel = HeadlineCellViewModel
    func update(viewModel viewModel: ViewModel) {
    // ...
    }
}


struct HeadlineCellViewModel {
    let headline: Headline

    init(headline: Headline) {
        self.headline = headline
    }
}

protocol UpdatableView: class {
    associatedtype ViewModel
    func update(viewModel viewModel: ViewModel)
}
4

1 回答 1

1

我认为它可能与编译器无法在编译时修复您的视图模型类型有关,这在 Swift 中是必需的。不过,它可能已在 Swift 3.0 中修复。我已经设法稍微更改了您的代码,因此它现在可以编译了。主要区别在于约束视图模型而不是 CellUpdater 扩展中的单元格。

struct CellUpdater<Cell where Cell: UpdatableView> : CellUpdaterType {
    typealias ViewModel = Cell.ViewModel

    let viewModel: ViewModel
}

extension CellUpdater where Cell.ViewModel : HeadlineCellViewModelType {
    func generateDetailsDrillDownController(index: Int) -> UIViewController? {
        let storyboard = UIStoryboard(name: "SomeStoryboard", bundle: nil)
        let vc = storyboard.instantiateViewControllerWithIdentifier("SomeViewController") as? SomeViewController
        vc?.headline = viewModel.headline
        return vc
    }
}

protocol HeadlineCellViewModelType {
    var headline: Headline { get }
}

struct HeadlineCellViewModel : HeadlineCellViewModelType {
    let headline: Headline

    init(headline: Headline) {
        self.headline = headline
    }
}
于 2016-07-11T22:10:17.710 回答