SwiftUI入门之View

目录

背景

最近离职刚好有了空闲时间,我很早就有开发自己app的想法。作为C++开发者,原本QT应该是上手最快的框架,但是实在喜欢Apple平台的颜值,因此打算快速入门一下SwiftUI。考虑到SwiftPlayground的教程使用SwiftUI,且Apple目前也在主推,故而不考虑从UIKit入手。

View

SwiftUI的核心是View。View是一个协议,所有的视图都需要遵循这个协议。SwiftUI提供了许多内置的视图类型,如TextImageButton等。要定义View可以使用以下语法:

struct ContentView: View { // 定义一个遵循View协议的结构体
    var body: some View { // some View让编译器推断具体类型
        Text("Hello, World!")
            .padding()
    }
}
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView() // 提供预览
    }
}

组合View

SwiftUI鼓励使用组合来构建复杂的界面。可以将多个视图组合在一起形成一个新的视图。例如:

struct ContentView: View {
    var body: some View {
        VStack { // 垂直堆叠
            Text("Hello, World!")
                .padding()
            Button(action: {
                print("Button tapped")
            }) {
                Text("Tap me")
            }
            HStack {
                // 水平堆叠
            }
        }
    }
}

some关键字

some关键字用于表示一个具体的类型,但在编译时不需要明确指定。它允许我们返回一个符合某个协议的类型,而不需要暴露具体的实现细节。 例如,在body属性中使用some View,表示返回一个符合View协议的类型,但不需要指定具体的视图类型。

var body : View // error, View不是具体的类型

struct关键字

struct关键字用于定义一个结构体。结构体是一种值类型,可以包含属性和方法。在SwiftUI中,视图通常使用结构体来定义,因为它们是轻量级的,并且可以通过值传递。 body的定义在对于熟悉C++的开发者来说可能有些困惑,返回值some View它的行为看起来像是一个函数,但实际上它是一个计算属性。计算属性是没有存储值的属性,而是通过计算来返回一个值。

struct Circle {
    var radius: Double // 存储属性
    var area: Double { // 计算属性,不占用存储空间
        return .pi * radius * radius
    }
}
struct ContentView: View {
    var body: some View { // 计算属性,用来描述当前视图的内容
        Text("Hello, World!")
    }
    var title: String // 值属性
}

定义方法

struct Circle {
    var radius: Double
    func printArea() {
        print("Area: \(Double.pi * radius * radius)")
    }
}

在Swift中,属性的值在方法中默认不可修改,除非使用mutating关键字标记方法。。

struct Circle {
    var radius: Double
    mutating func resize(to newRadius: Double) {
        radius = newRadius
    }
}

访问自身实例

类似Rust,Swift中也可以使用self关键字来引用当前实例,通常情况下不显示使用。

struct Circle {
    var radius: Double
    mutating func resize(to newRadius: Double) {
        self.radius = newRadius // 使用self引用当前实例
    }
}

静态属性和方法

静态属性和方法使用static关键字定义,属于类型本身而不是实例。

struct Circle {
    static let pi = 3.14159 // 静态属性
    var radius: Double
    
    static func calculateArea(radius: Double) -> Double { // 静态方法
        return pi * radius * radius
    }
}

Tags: #SwiftUI