После использования xcode 16 у меня возникла ошибка сборки приведенного ниже кода
Cast from 'ObservableCollection.SectionsChange' (aka 'CollectionChange') to unrelated type 'ObservableCollection.SectionsChange' (aka 'CollectionChange') always fails
для метода протокола раздела, который я реализовал, первое приведение все еще работает
class ObservableCollectionDelegateMock: ObservableCollectionDelegate {
var collectionDidRowBatchUpdateAtExpect = LIExpect()
var collectionDidSectionBatchUpdateAtExpect = LIExpect()
var rowBatchUpdates: ObservableCollection.RowsChange?
var sectionBatchUpdates: ObservableCollection.SectionsChange?
func collection(_ collection: ObservableCollection, rowsDidChange change: ObservableCollection.RowsChange) {
collectionDidRowBatchUpdateAtExpect.called(actualParams: nil)
rowBatchUpdates = change as? ObservableCollection.RowsChange
}
func collection(_ collection: ObservableCollection, sectionsDidChange change: ObservableCollection.SectionsChange) {
collectionDidSectionBatchUpdateAtExpect.called(actualParams: nil)
sectionBatchUpdates = change as? ObservableCollection.SectionsChange
}
}
Вот определение ObservableCollectionDelegate
который является протоколом, касающимся этих двух методов, которые необходимо переопределить подклассом
public protocol ObservableCollectionDelegate: AnyObject {
func collection(_ collection: ObservableCollection, rowsDidChange change: ObservableCollection.RowsChange)
func collection(_ collection: ObservableCollection, sectionsDidChange change: ObservableCollection.SectionsChange)
}
вот определение этих двух псевдонимов.
class ObservableCollection {
// MARK: - Nested Types
public typealias RowsChange = CollectionChange
public typealias SectionsChange = CollectionChange
.......
}
и это определение наблюдаемого массива
public class ObservableArray {
// MARK: - Public Properties
public var count: Int {
return elements.count
}
public var isEmpty: Bool {
return elements.isEmpty
}
public var hasElements: Bool {
return !elements.isEmpty
}
/// Returns the snapshot of current state as a normal array. (Essentially returning the copy of itself).
public var snapshot: [T] {
return elements
}
// MARK: - Internal Properties
internal(set) public var elements: [T]
// MARK: - Lifecycle
public init(elements: S) where S: Sequence, S.Element == T {
self.elements = [T](elements)
}
......
Насколько я понимаю, похоже, что для xcode 16 компилятор не может регистрировать универсальный тип, если есть вложенные универсальные типы.
в нашем случае это
ObservableCollection.SectionsChange' (также известный как 'CollectionChange')
интересно есть ли способ это обойти? или это то, что Swift 6 запрещает делать?
спасибо
================ ==================================
Чтобы сделать код легче воспроизвести, я создаю демо-версию, чтобы решить ту же проблему
import UIKit
import Foundation
public struct CollectionChange {}
public class ObservableArray {
// MARK: - Internal Properties
internal(set) public var elements: [T]
// MARK: - Lifecycle
public init(elements: S) where S: Sequence, S.Element == T {
self.elements = [T](elements)
}
public convenience init() {
self.init(elements: [])
}
}
open class ObservableCollection {
public typealias RowsChange = CollectionChange
public typealias SectionsChange = CollectionChange
}
public protocol ObservableCollectionDelegate: AnyObject {
func collection(_ collection: ObservableCollection, rowsDidChange change: ObservableCollection.RowsChange)
func collection(_ collection: ObservableCollection, sectionsDidChange change: ObservableCollection.SectionsChange)
}
class ObservableCollectionDelegateMock: ObservableCollectionDelegate {
var rowBatchUpdates: ObservableCollection.RowsChange?
var sectionBatchUpdates: ObservableCollection.SectionsChange?
func collection(_ collection: ObservableCollection, rowsDidChange change: ObservableCollection.RowsChange) {
rowBatchUpdates = change as? ObservableCollection.RowsChange
}
func collection(_ collection: ObservableCollection, sectionsDidChange change: ObservableCollection.SectionsChange) {
sectionBatchUpdates = change as? ObservableCollection.SectionsChange
}
}
Вы можете попробовать на местном уровне, а может быть, просто поставить на детской площадке. Я попробовал xcode 15, он отлично работает со Swift 5
а для xcode 16 со Swift 6 есть ошибка
Cast from 'ObservableCollection.SectionsChange' (aka 'CollectionChange') to unrelated type 'ObservableCollection.SectionsChange' (aka 'CollectionChange') always fails
Подробнее здесь: https://stackoverflow.com/questions/790 ... or-swift-6
Получить ошибку приведения для универсального типа в xcode 16 для Swift 6 ⇐ IOS
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Получить ошибку приведения для универсального типа в xcode 16 для Swift 6
Anonymous » » в форуме IOS - 0 Ответы
- 9 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Создание универсального массива в Java с помощью непроверяемого приведения типов
Anonymous » » в форуме JAVA - 0 Ответы
- 4 Просмотры
-
Последнее сообщение Anonymous
-