Некоторые View в качестве входного параметра метода / инициализатора - PullRequest
0 голосов
/ 18 января 2020

Может ли кто-нибудь объяснить, как следует использовать some View?

Прав ли я, что приведение типа к требуемому типу является только правильным алгоритмом для передачи созданной переменной в другой метод / инициализатор? В приведенном ниже коде только принудительное приведение помогло мне создать TupleView.

let shadowRectangle: some View = self.shadowRectangle(
                width: w,
                heightTop: heightTop
            )
            return AnyView(
                ZStack<TupleView<(Rectangle, Path)>>.init(content: { () -> TupleView<(Rectangle, Path)> in
                    return TupleView<(Rectangle, Path)>.init((shadowRectangle as! Rectangle,
                    simplePathView as! Path))
                })

. Странно выглядит то, что многие методы View возвращают some View. Я должен использовать его каждый раз, когда я хочу использовать его вне текущей области. Например, метод .offset() возвращает some View.

Ответы [ 2 ]

0 голосов
/ 18 января 2020

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 (как обсуждалось выше).

Так что этот вопрос скорее зачем вам это нужно вместо того, правильно ли вы синтаксически или нет.

0 голосов
/ 18 января 2020

Разве это не то же самое, что предусмотрено, простите, кошмар ?

var simplePathView: some View {
    // path to be returned here
}

func shadowRectangle(width: CGFloat, heightTop: CGFloat) -> some View {
    // rect to be returned here
}

func foo() -> some View {
    ZStack {
        self.shadowRectangle(width: w, heightTop: heightTop)
        simplePathView
    }
}
...