SwiftUI入门之View
背景
最近离职刚好有了空闲时间,我很早就有开发自己app的想法。作为C++开发者,原本QT应该是上手最快的框架,但是实在喜欢Apple平台的颜值,因此打算快速入门一下SwiftUI。考虑到SwiftPlayground的教程使用SwiftUI,且Apple目前也在主推,故而不考虑从UIKit入手。
View
SwiftUI的核心是View。View是一个协议,所有的视图都需要遵循这个协议。SwiftUI提供了许多内置的视图类型,如Text、Image、Button等。要定义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