«Функция объявляет непрозрачный тип возвращаемого значения [...]» при объявлении представления как переменной внутри тела представления в SwiftUI - PullRequest
6 голосов
/ 08 июня 2019

Предположим, у меня есть View с Image, который имеет свойство shadow:

struct ContentView: View {
    var body: some View {
        Image("turtlerock").shadow(radius: 10)
    }
}

Теперь представьте, что я хочу получить доступ к значению радиуса тени. Я предполагал, что смогу сделать это:

struct ContentView: View {
    var body: some View {
        let myImage = Image("turtlerock").shadow(radius: 10)
        print(myImage.modifier.radius)
    }
}

Однако это возвращает ошибку:

Функция объявляет непрозрачный тип возвращаемого значения, но в его теле нет операторов возврата, из которых можно вывести базовый тип

Есть ли способ как-нибудь это сделать?

Ответы [ 3 ]

10 голосов
/ 08 июня 2019

При изменении и построении представлений вы можете сделать это без оператора возврата и строительного блока друг над другом без запятых.Это называется закрытием нескольких операторов.Когда вы попытаетесь создать переменную в закрытии нескольких операторов, компилятор будет жаловаться на несоответствие типов (вы можете только комбинировать представления один за другим, , ничего больше ).См. Этот ответ для получения более подробной информации: https://stackoverflow.com/a/56435128/7715250

Чтобы исправить это, нужно явным образом вернуть комбинируемые представления, чтобы вы не использовали операторы multi-closure:

struct MyView: View {
    var body: some View {
        let image = Image("Some image").shadow(radius: 10)
        let myRadius = image.modifier.radius

        // Do something with myRadius

        return image // No multi closure statements.
    }
}
1 голос
/ 08 июня 2019

Вы можете определить изображение вне тела:

let myImage = Image("turtlerock").shadow(radius: 10)

var body: some View {
  myImage
}

Для печати радиуса вы можете сделать так:

var body: some View {
  myImage
    .tapAction {
      print(self.myImage.modifier.radius) // 10.0
  }
}
0 голосов
/ 08 июня 2019

Если ваше представление, на которое вы хотите сослаться, находится внутри стека, вы должны объявить его вне стека следующим образом:

var body: some View {
    let myImage = Image("image").shadow(radius: 10)

    let stack = HStack {
        myImage
        Image("image2")
    }

    return stack
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...