После использования 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
Программируем под IOS
1727930998
Anonymous
После использования 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 компилятор не может регистрировать универсальный тип, если есть вложенные универсальные типы.
в нашем случае это
[b]ObservableCollection.SectionsChange' (также известный как 'CollectionChange')[/b]
интересно есть ли способ это обойти? или это то, что 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
Подробнее здесь: [url]https://stackoverflow.com/questions/79041155/get-cast-error-for-generic-type-in-xcode-16-for-swift-6[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия