var x: some AnyProtocol
говорит вам одну вещь в swift, больше ничего:
Значение x
является точным типом (который никогда не изменится), и этот определенный тип соответствует AnyProtocol
.
По сути, он скрывает от вас точный тип возвращаемого значения и дает вам только знать, что указанный тип соответствует протоколу, поэтому вы можете вызывать его указанные методы.
Чтобы вернуться к вашему примеру, вы правы, если вы хотите, чтобы возвращаемое значение было точно ZStack<TupleView<(Rectangle, Path)>>
, вам нужно привести some View
-s к Rectangle
или Path
. Но обычно вам не нужно ничего подобного, потому что вы теряете цель ключевого слова some
: скрыть точный тип представлений. Если вам нужны точные типы, вам не следует их скрывать, используя ключевое слово some
. Если вы используете точные типы, компилятор снова сможет выводить обобщенные типы c, и приведение не требуется.
Итак, я бы сделал это здесь:
let simplePathView: Path = yourPathCreatingFunc()
let shadowRectangle: Rectangle = self.shadowRectangle(width: w, heightTop: heightTop)
return AnyView(ZStack {
TupleView((simplePathView, shadowRectangle))
})
Я вижу, что многие люди небрежно используют some View
, так как считают, что это помогает им, потому что им не нужно думать о типах возвращаемых данных или типах переменных, они просто пишут some View
везде. Это тот случай, когда он идет не так, потому что он сталкивается с истинным значением some
(как обсуждалось выше).
Так что этот вопрос скорее зачем вам это нужно вместо того, правильно ли вы синтаксически или нет.