172 похожих чатов

Привет! Подскажите плиз, получаю такую ошибку: Cannot convert value of type

'CellViewModel<ListItemTableViewCell>' to type 'CellViewModel<UITableViewCell>' in coercion

ListItemTableViewCell под капотом наследуется от UITableViewCell, почему не получается сконвертить одно в другое?

4 ответов

8 просмотров

Очень интересный вопрос. Всё просто, в Swift пошли по пути наименьшего сопротивления, а это в свою очередь означает, что "все" дженерики находятся в инвариантной позиции. Несмотря на это, всё ж стандартные коллекции, скажем обычный массив, который имеет дженерик параметр Element, находится в ковариантой позиции. Именно поэтому 1ый пример нерабочий, а 2ой рабочий.

Руслан Лутфуллин
screenshot Очень интересный вопрос. Всё просто, в Swift пошли...

Вообще говоря возможность такой замены зависит от использования этого самого дженерик параметра. Если дженерик параметр используется только в качестве возвращаемого значения для методов и ридонли сабскриптов и свойств, то он находтся в ковариантной позиции и такая замена возможна: class B: A { } let foo0 = Foo<B> let foo1 = Foo<A> = foo0 Если дженерик параметр используется в качестве параметров у методов, то он находится в инвариантной позиции и замена выше уже невозможно, а такая замена возможна:: class B: A { } let foo0 = Foo<A> let foo1 = Foo<B> = foo0 Если дженерик параметр используется в обоих случаях, то единственный рабочий вариант в таком случае, когда A и B один и тот же тип. Это вообще говоря довольно сложная тема, поэтому в Swift все дженерик просто по умолчанию находятся в инвариантной позиции.

Руслан Лутфуллин
screenshot Очень интересный вопрос. Всё просто, в Swift пошли...

ну вроде логично, ведь это разные типы. то что там в конкретике используется nsview и nsbutton видимо не имеет значения, там ведь мог бы быть какой-нибудь double. если вариант ниже с массивами компилируется, то возможно это какими-нибудь расширениями и кастомными инициализаторами в массиве сделано

Denis Kim
ну вроде логично, ведь это разные типы. то что там...

Это связано исключительно с понятиями ковариантности/контрвариантности Стандартные value типы на уровне компилятора поддерживают возможную ковариантность/контравариантность, тогда как пользовательские типы такой возможности не имеют, потому что за этим довольно сложно статически проследить, что бы это ничего не нарушило. То есть да, компилятору сложно проверить все места где используется этот параметр, что бы убедиться, что тут именно NSView —> NSButton, а не NSView —> Double. Но при этом, это работает в более простых случаях, не связанных с дженериками, скажем: let a = (NSView) -> NSButton = { ... } let b = (NSButton) -> NSView = a

Похожие вопросы

Обсуждают сегодня

Добрый вечер. Есть вопрос, а может и предложение. Был у меня диалог в другой группе о делфи и я задался вопросом: "А нельзя ли в делфи цвет //коментария и {комментария} сде...
Kraszx
24
Всем привет! Подскажи, пожалуйста, как передать в TComboBox сразу значение и id записи. На Delphi я делал так: ComboBox1.Items.AddObject('Какое-то значение', Pointer(id запис...
Евгений
13
Мдя, прикол, боевая сборка запускается (именно под отладчиком) после F9 примерно полторы минуты (97 секунд если быть точным). Начал копать - проблема детектится сразу - зависа...
Александр (Rouse_) Багель
38
Здравствуйте, вопрос по структурам данных. Были у вас случаи, когда пришлось писать деревья или двунаправленные списки?
/ /
50
Товарищи, кто работа с iphelper? Или может я в самой логике ошибки фигачу, не пойму.... var ifTable : PMIB_IFTABLE; size, corSize: DWORD; Buffer ...
Warfarellen
4
я так понимаю, я так подозреваю, что создание такого плагина для человека, кто умеет писать плагины для делфи потребует минут 5-10 времени. но это мое подозрение. хотелось бы ...
Kraszx
7
Коллеги, добрый вечер. Создаю коллекцию от TFPGMap, ключ - перечисление, значение - целое. Нужно отсортировать коллекцию по значению. Как это можно сделать?
Kirill Filippenok
11
Скажи а ты когда этот канал создавал ты уже дельфи не любил, или это со временем пришло?
Роман Лях (rgreat)
18
Привет, такой вопросик появился кажется ли вам что Rust слишком сложный/строгий для высокоуровневого программирования и слишком "безопасный"/строгий для низкоуровневого?
Крокант
10
Всем привет! Использую кастомное модальное диалоговое окошко, все по классике - mrOK, mrCancel как ModalResult. Однако есть нюанс - в главной форме есть универсальный обработч...
Олег Гранишевский
20
Карта сайта