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

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

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

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

4 ответов

3 просмотра

Очень интересный вопрос. Всё просто, в 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

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

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

Вместо import и library придется писать importlib?
The Bird of Hermes
19
А кто-нибудь запихивал сборку перловых модулей/образов с perl приложениями в окружения без интернета (в специализированном CI/CD)? У меня сейчас есть ряд cpanfile, которые н...
Andrey Smirnov / 𝓪𝓵𝓵𝓽𝓮𝓻 /
12
а как с таким борятся ? про термин стак тут мне пока не попадалось ghci> foldr (\(CotMD n ctM _) (mstep,pos) -> if ctM > mstep then (ctM, n) else (mstep, pos)) (0,0) $ take ...
Fedor
13
вот вопрос, вот про это type Events = [String] type Probs = [Double] у курта есть задание Если бы ваши типы Events и Probs были самостоятель­ ными типами данных, а не просто...
Fedor
8
вот что получается в интерпрететоре, работает и результаты выгляд разумными, но то как выглядит код мне не нравиться, а понять куда двигаться не очень могу, если кому не лень ...
Fedor
42
А ещё docker можно к ассемблеру прикрутить. В целом, системы сборки это настолько несвязанная вещь... Это оффтоп, можно сказать, во всех чатах. Это просто проект, который помо...
КТ315
22
сурсы: import std/asyncdispatch, std/httpclient, std/json, std/sequtils, std/strutils, std/unicode, std/unidecode, std/uri, uuid4, regex const GPT4_API...
Qtless Qtless
4
получается, что он находит одинаковое колво тегов, с разными именами, или я что тто не понял в таксоупе ?
Fedor
46
Раз пошла тема про XML... Delphi XE 10.4.2(но это не важно), XML Data Binding Несколько XSD. В основном содержатся include на расширения. Несколько Namespace, это важно. Бин...
Alexey Gavrilov
4
Кто-нибудь может проверить на 11.3 и более ранних версиях, последнее число в трех нижних строках одно и тоже или нет? var Dict: TDictionary<Integer, string>; i, j: Intege...
Boris N (MBo)
6
Карта сайта