Swift: 使用泛型实例关联类型段错误编译器
Swift: using instance of a generic type associatedtype segfaults compiler
当我尝试编译以下代码时出现分段错误。我正在尝试在 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)
}
我认为这可能与编译器无法在编译时修复视图模型类型有关,这在 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
}
}
当我尝试编译以下代码时出现分段错误。我正在尝试在 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)
}
我认为这可能与编译器无法在编译时修复视图模型类型有关,这在 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
}
}