К какому типу относится переменная "body" SwiftUI? - PullRequest
1 голос
/ 06 февраля 2020

Быстрый вопрос: что такое переменная тела? Если я прав в своей интерпретации Swift, он инициализируется как объект View или один из его подклассов. Однако внутри его инициализации, кажется, есть ряд вызовов конструктора (таких как Text () или Image ()), которые не сохраняются ни в одной переменной или не возвращаются. Я новичок в Swift из Java, и я не смог найти много об этом в Интернете. Может кто-нибудь объяснить, пожалуйста?

Кроме того, то же самое для VStack и HStack - это коллекции объектов?

import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack {
            Text("Hello SwiftUI!")
        }
    }
}

struct ContentView_Preview: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

Ответы [ 2 ]

1 голос
/ 06 февраля 2020

это легко проверить. попробуйте следующий на вашей игровой площадке

import SwiftUI
import PlaygroundSupport

struct ContentView: View {
    var body: some View {
        VStack {
            Text("Hello SwiftUI!")
        }
    }
}

let cv = ContentView()
print("type of ContentView.body:", type(of: cv.body))
PlaygroundPage.current.setLiveView(cv)

он печатает

type of ContentView.body: VStack<Text>

Несмотря на то, что View является протоколом, структура, принимающая его, ДОЛЖНА ИМЕТ БЕТОННЫЙ ТИП.

это можно записать как

import SwiftUI
import PlaygroundSupport

struct ContentView: View {
    var body: some View {
        let t = Text("Hello World!")
        let content: ()-> Text = {
            return t
        }
        let vs = VStack(alignment: .center, spacing: 0, content: content)
        return vs
    }
}

let cv = ContentView()
print("type of ContentView.body:", type(of: cv.body))
PlaygroundPage.current.setLiveView(cv)

с тем же результатом .-)

НЕ ПЫТАЙТЕСЬ ОПРЕДЕЛИТЬ КЛАСС, СООТВЕТСТВУЮЩИЙ ПРОСМОТРУ ПРОТОКОЛА!

этот код будет скомпилирован без ошибок, но он взломает sh ... Да, многое можно улучшить, я ожидаю, что компиляция не удастся.

import SwiftUI
import PlaygroundSupport

final class ContentView: View {
    var body: some View {
        let t = Text("Hello World!")
        let content: ()-> Text = {
            return t
        }
        let vs = VStack(alignment: .center, spacing: 0, content: content)
        return vs
    }
}

let cv = ContentView()
print("type of ContentView.body:", type(of: cv.body))
PlaygroundPage.current.setLiveView(cv)
0 голосов
/ 06 февраля 2020

View - это протокол, а не класс. Тип body - some View, который является непрозрачным типом результата, то есть он возвращает некоторый конкретный конкретный тип, который реализует View, но этот конкретный тип не предоставляется публикуемой c как часть API .

SwiftUI использует синтаксис построителя функций Swift, хотя я не уверен, как вы могли бы понять это самостоятельно, не прочитав его сначала где-то еще.

Дальнейшее чтение: https://www.swiftbysundell.com/articles/the-swift-51-features-that-power-swiftuis-api/

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