Почему я могу передать аргумент типа «любой протокол» в параметр типа «Протокол»?IOS

Программируем под IOS
Ответить
Anonymous
 Почему я могу передать аргумент типа «любой протокол» в параметр типа «Протокол»?

Сообщение Anonymous »

У меня есть этот код: < /p>

Код: Выделить всё

import RealityKit

protocol RLActionImpl {}

struct RLAction {
let impl: Impl
}

struct RLAggregationActionImpl: RLActionImpl {
enum Aggregation {
case sequence
case group
}
let impls: [RLActionImpl]
let aggregation: Aggregation

func process(entity: Entity) {
impls.forEach { impl in
// ERROR
let action = RLAction(impl: impl)
entity.runAction(action)
}
}
}

extension Entity {
func runAction(_ action: RLAction) {
// some logic here
}
}
< /code>
он не работает с ошибкой: < /p>
Type 'any RLActionImpl' cannot conform to 'RLActionImpl'
Это имеет смысл, потому что любой rlactionImpl является непрозрачным ящиком, поэтому он не соответствует rlactionImpl .
Однако, если я просто перемещаю rlaction (IMPL: IMPL) в функцию Helper RunImpl , он работает:

Код: Выделить всё

extension Entity {
func runImpl(_ impl: some RLActionImpl) {
let action = RLAction(impl: impl)
runAction(action)
}
}

// ...

func process(entity: Entity) {
impls.forEach { impl in
entity.runImpl(impl)
}
}
Это странно - некоторые rlactionImpl означает, что тип известен во время компиляции, но компилятор не знает фактического типа какого -либо rlactionImpl , так как же я могу пройти в любом rlactionImpl ?

Подробнее здесь: https://stackoverflow.com/questions/797 ... -type-some
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»