SwiftUI简单基础知识学习

news2024/10/7 8:24:44

在这里插入图片描述

以下是一个大致的学习计划,将SwiftUI的知识分成12个主题:

  1. SwiftUI 简介和基础语法
  2. 视图和布局
  3. 状态和数据流
  4. 按钮和用户输入
  5. 列表和数据展示
  6. 导航和页面传递
  7. 动画和过渡效果
  8. 手势和交互
  9. 绘制和绘图
  10. 多平台适配
  11. 网络和数据请求
  12. 实际项目实践和高级主题

每个主题可以安排为一个独立的学习单元,你可以根据自己的学习进度调整时间分配。对于每个主题,你可以通过以下方式进行学习:

1. SwiftUI 简介和基础语法

当我们谈论SwiftUI的简介和基础语法时,首先需要了解SwiftUI是什么以及它的特点。

SwiftUI是苹果公司推出的一种用于构建应用程序用户界面的框架。它是基于Swift语言的,具有声明式的语法,可以让开发者更简单、更高效地创建用户界面。

下面是一些SwiftUI的基础语法和概念:

  1. 视图和容器:

    • SwiftUI的核心构建块是视图(View),它代表了应用程序的用户界面组件。
    • 视图可以是简单的,比如文本标签(Text)、按钮(Button),也可以是复杂的,比如列表视图(List)或者表单视图(Form)。
    • 视图可以嵌套在容器视图中,容器可以是垂直布局的容器(如VStack),也可以是水平布局的容器(如HStack)。
  2. 声明式语法:

    • SwiftUI使用声明式语法,这意味着你只需要描述你想要的结果,而不需要手动处理每个界面操作的细节。
    • 相比传统的命令式编程,声明式语法使代码更易读、更易维护。
  3. 预览和实时预览:

    • SwiftUI提供了一个名为“预览”的功能,可以在开发过程中实时查看和调试界面的外观和行为。
    • 预览可以在不启动模拟器或真机的情况下查看不同设备上的界面效果,节省了开发时间。
  4. 数据绑定:

    • SwiftUI支持数据绑定,即将视图与数据进行绑定,当数据变化时,视图会自动更新。
    • 这意味着你可以轻松地处理用户交互、数据的增删改查,而不需要手动更新视图状态。
  5. 修饰符:

    • SwiftUI使用修饰符(Modifier)来更改和定制视图的外观和行为。
    • 修饰符可以链式调用,允许你按顺序应用多个修饰符,从而创建出你想要的效果。

2. 视图和布局

在SwiftUI中,视图(View)是构建应用程序用户界面的基本构建块。视图用于呈现内容、响应用户输入并展示应用程序的外观。

以下是一些关于视图和布局的详细信息:

  1. 内置视图:

    • SwiftUI提供了许多内置的视图,例如Text(文本标签)、Image(图像)、Button(按钮)、TextField(文本输入框)等等。这些视图可以用于构建应用程序的各个部分。
  2. 自定义视图:

    • 除了内置视图,你还可以创建自定义视图,以满足特定的界面需求。自定义视图可以通过组合多个现有视图来创建,也可以通过继承View协议并实现自己的内容来创建。
  3. 布局和容器视图:

    • 布局是指将视图放置在屏幕上的方式。SwiftUI提供了许多容器视图,用于定义视图的布局结构。常用的容器视图包括VStack(垂直布局)、HStack(水平布局)、ZStack(层叠布局)等。
    • 容器视图可以嵌套使用,形成更复杂的布局结构。通过使用这些容器视图,你可以构建出多层次的视图层次结构。
  4. 对齐和间距:

    • SwiftUI提供了对齐和间距的修饰符,以控制视图在容器内的位置关系和距离。
    • 例如,你可以使用alignment修饰符来指定视图在容器中的对齐方式,使用spacing修饰符来指定视图之间的间距。
  5. 响应用户输入:

    • SwiftUI允许你向视图添加手势识别器(Gesture Recognizer)来响应用户的触摸、点击等操作。
    • 你可以使用onTapGesture、onLongPressGesture等方法来添加响应函数,并对用户的输入进行处理。

3. 状态和数据流

在SwiftUI中,状态和数据流是非常重要的概念。它们帮助我们管理和更新应用程序的数据,并确保界面与数据保持同步。

以下是关于状态和数据流的详细讲解:

  1. 状态:

    • 状态是应用程序中的可变数据。它可以是简单的值(如布尔值、整数)或复杂的数据结构(如数组、字典)。
    • 在SwiftUI中,你可以使用@State属性包装器将状态绑定到视图上。这样,当状态发生变化时,视图会自动更新。
    • 通过@State属性包装器,SwiftUI会追踪状态的变化,并确保界面与最新的状态保持同步。
  2. 数据流:

    • 数据流是指数据在应用程序中的传递和响应。在SwiftUI中,数据流是单向的,从父视图向子视图传递。
    • 你可以在父视图中定义数据,并使用@State属性包装器进行管理。然后,通过传递数据到子视图的方式,子视图可以读取和响应这些数据。
    • 为了实现数据流,SwiftUI使用了一些属性包装器,例如@Binding、@StateObject、@ObservedObject等,它们可以实现视图之间的数据共享和更新。

    当我们需要将数据从父视图传递到子视图时,可以使用@State属性包装器和参数传递的方式实现。以下是一个示例:

struct ParentView: View {
    @State private var message = "Hello"

    var body: some View {
        VStack {
            Text(message)
            ChildView(message: $message)
        }
    }
}

struct ChildView: View {
    @Binding var message: String

    var body: some View {
        VStack {
            Text("Child View")
            TextField("Enter message", text: $message)
        }
    }
}

在上面的示例中,我们在ParentView中创建了一个@State属性message,并将其作为参数传递给ChildView。在ChildView中,我们使用@Binding属性包装器标记message属性,以便使其成为一个可编辑的绑定属性。

当我们在ChildView中修改TextField中的文本时,实际上是修改了父视图中的message属性的值。由于message属性被标记为@Binding,所以父视图中的Text视图会自动更新以反映最新的值。

通过这种方式,我们实现了在父视图中定义数据,并将其传递给子视图以响应和更新。这是一种常见的数据传递和响应机制,在复杂的应用程序中非常有用。

  1. 状态管理:
    • 对于复杂的应用程序,仅仅依赖@State可能不够。在这种情况下,你可以使用@StateObject、@ObservedObject等属性包装器来管理状态。
    • 这些属性包装器允许你创建独立的状态对象,并在多个视图中共享这些状态对象,从而实现更复杂的数据管理和更新。

@ObservedObject:

  • @ObservedObject属性包装器用于管理应用程序中的可观察对象(Observable Object)。
  • 可观察对象是一个遵循ObservableObject协议的自定义类,它负责存储和管理应用程序状态的数据。
  • 通过将可观察对象声明为视图的属性,然后在视图中使用@ObservedObject属性包装器进行引用,我们可以实现对可观察对象属性的观察和更新。

以下是一个使用@ObservedObject的简单示例:

class UserData: ObservableObject {
    @Published var name: String = ""
}

struct ContentView: View {
    @ObservedObject var userData = UserData()

    var body: some View {
        TextField("Enter your name", text: $userData.name)
        Text("Hello, \(userData.name)!")
    }
}

在上面的示例中,UserData类是一个可观察对象,其中的name属性使用了@Published属性包装器,使其能够被观察。在ContentView中,我们使用@ObservedObjectuserData属性标记为可观察对象,当name属性发生变化时,视图会自动更新。

@EnvironmentObject:

  • @EnvironmentObject属性包装器使我们能够在视图之间共享和访问全局的可观察对象。
  • 可观察对象通过使用@EnvironmentObject属性包装器在外部的父视图中设置,然后在子视图中进行访问和使用。
  • 这种方法可用于跨多个视图共享和更新数据,而不需要每个视图都显式传递和维护状态对象。

以下是一个使用@EnvironmentObject的示例:

class UserData: ObservableObject {
    @Published var name: String = ""
}

struct ContentView: View {
    @EnvironmentObject var userData: UserData

    var body: some View {
        TextField("Enter your name", text: $userData.name)
        Text("Hello, \(userData.name)!")
    }
}

在上面的示例中,我们创建了一个名为UserData的可观察对象,并在外部环境中设置它(通常在应用程序的顶层)。然后在ContentView中使用@EnvironmentObject属性包装器将该对象注入到视图中,以便在视图内部使用它。

这些是使用@ObservedObject@EnvironmentObject属性包装器进行状态管理的两个示例。通过使用这些属性包装器,我们可以创建独立的、可观察的对象,实现状态的共享和更新,从而使应用程序更具灵活性和可扩展性。希望这些示例能够帮助你理解如何进行状态管理,如果你还有进一步的问题,请随时提问。
4. 事件和动作:

  • 在SwiftUI中,你可以通过添加按钮、手势等来触发事件和动作。
  • 通过使用@State或其他属性包装器,你能够捕获和处理这些事件,并更新相应的状态,从而改变界面的可视化效果。

在SwiftUI中,我们可以通过添加按钮、手势等的方式来触发事件和动作。这些事件和动作可以与@State或其他属性包装器一起使用,以捕获、处理和更新状态,从而改变界面的可视化效果。

  1. 添加按钮事件:

    • 可以使用Button视图来创建按钮,并为按钮添加事件处理程序。
    • 通过在按钮的action闭包中编写处理逻辑,可以定义按钮被点击时要进行的操作。

    这是一个示例,展示了如何在按钮的点击事件中改变状态:

    struct ContentView: View {
        @State private var isButtonTapped = false
    
        var body: some View {
            VStack {
                if isButtonTapped {
                    Text("Button is tapped")
                } else {
                    Text("Button is not tapped")
                }
                Button(action: {
                    isButtonTapped.toggle()
                }) {
                    Text("Tap me")
                }
            }
        }
    }
    

    在上面的示例中,我们创建了一个Button并为其指定了一个action闭包。按钮被点击时,isButtonTapped属性的值将被切换,从而改变了界面上显示的文本。

  2. 添加手势事件:

    • 除了按钮,我们还可以使用手势来触发事件和动作。手势可以识别用户的交互动作,例如轻按、滑动、拖动等。

    这是一个示例,展示了如何使用手势改变状态:

    struct ContentView: View {
        @State private var isDragging = false
    
        var body: some View {
            let dragGesture = DragGesture()
                .onChanged { _ in
                    isDragging = true
                }
                .onEnded { _ in
                    isDragging = false
                }
    
            Circle()
                .frame(width: 100, height: 100)
                .gesture(dragGesture)
                .foregroundColor(isDragging ? .red : .blue)
        }
    }
    

    在上面的示例中,我们创建了一个圆形视图,并为其添加了拖动手势。当手指在视图上拖动时,isDragging属性的值将被设置为true,从而改变了圆形视图的背景颜色。

通过这些示例,我们可以看到如何使用按钮和手势来触发事件和动作,并通过@State属性来改变界面的可视化效果。这使得我们能够与用户进行交互,并根据交互动作来更新应用程序的状态。

状态和数据流是SwiftUI中非常强大的概念,它们帮助构建有交互性和动态性的应用程序。通过合理地使用和管理状态,你可以轻松构建出响应式、流畅的用户界面。

4. 按钮和用户输入

在SwiftUI中,按钮和用户输入是实现用户交互的重要组成部分。你可以使用Button视图创建按钮,并通过处理器闭包对按钮点击事件作出响应。此外,SwiftUI还提供了许多视图用于接收和处理用户输入,例如TextFieldDatePicker等。

以下是关于按钮和用户输入的详细介绍以及示例:

  1. 按钮:

    • 使用Button视图可以创建可点击的按钮。你可以为按钮提供一个标签(例如Text视图)来显示按钮上的内容,并为按钮添加一个action闭包,以在按钮被点击时执行相应的操作。

    示例代码:

    struct ContentView: View {
        @State private var isButtonTapped = false
    
        var body: some View {
            VStack {
                Text(isButtonTapped ? "Button is tapped" : "Button is not tapped")
                Button(action: {
                    isButtonTapped.toggle()
                }) {
                    Text("Tap me")
                }
            }
        }
    }
    

    在上面的示例中,我们创建了一个按钮,当按钮被点击时,isButtonTapped的状态将被切换,从而改变了上方文本的显示。

  2. 用户输入:

    • SwiftUI提供了多个视图用于接收和处理用户的输入,例如TextFieldDatePickerSlider等。你可以通过使用这些视图,结合@State属性包装器,来获取用户的输入值并更新界面。

    示例代码:

    struct ContentView: View {
        @State private var name: String = ""
    
        var body: some View {
            VStack {
                TextField("Enter your name", text: $name)
                Text("Hello, \(name)!")
            }
        }
    }
    

    在上面的示例中,我们创建了一个TextField来接收用户输入的名称。我们将name属性绑定到TextField的文本,并在界面上显示输入的名称。

    当用户在TextField中输入文本时,name属性会自动更新,并且相关的Text视图将显示相应的问候语。

通过使用按钮和用户输入视图,我们能够实现与用户的交互,接收用户的操作和输入,并响应进行相应的操作。这为创建交互式的用户界面提供了简单而强大的工具。

5. 列表和数据展示

列表和数据展示在应用程序中起着重要的作用,它们用于展示和组织大量的数据。在SwiftUI中,你可以使用ListForEach等视图来创建列表,并结合数据源来展示和处理数据。

以下是关于列表和数据展示的详细说明以及示例:

  1. 创建列表:

    • 使用List视图可以创建一个有序的、可滚动的列表。你可以将一个包含多个元素的集合传递给List,并在闭包中定义每个元素的展示方式。

    示例代码:

    struct ContentView: View {
        let fruits = ["Apple", "Banana", "Orange"]
    
        var body: some View {
            List(fruits, id: \.self) { fruit in
                Text(fruit)
            }
        }
    }
    

    在上面的示例中,我们创建了一个简单的水果列表。我们将字符串数组fruits传递给List,并通过闭包来定义每个水果的展示方式。

    每个水果都会作为一个Text视图显示在列表中。

  2. 使用ForEach从数据源创建视图:

    • 除了List,你还可以使用ForEach视图和数据源来创建自定义的列表。ForEach可以接收一个集合,并为集合中的每个元素创建对应的视图。

    示例代码:

    struct ContentView: View {
        struct Fruit {
            let id = UUID()
            let name: String
        }
    
        let fruits = [
            Fruit(name: "Apple"),
            Fruit(name: "Banana"),
            Fruit(name: "Orange")
        ]
    
        var body: some View {
            VStack {
                ForEach(fruits, id: \.id) { fruit in
                    Text(fruit.name)
                }
            }
        }
    }
    

    在上面的示例中,我们创建了一个自定义的Fruit结构体,并在fruits数组中包含多个实例。使用ForEach,我们将每个水果的名称作为一个Text视图进行展示,并根据每个Fruit结构体的唯一标识符来标识视图。

这些示例展示了在SwiftUI中如何使用ListForEach来创建列表,并展示和处理数据。

ListForEach提供了灵活且功能丰富的方式来展示和处理数据,并且可以根据你的需求进行自定义。你可以根据自己的数据结构和需求来选择适合的方式来展示和组织数据。

当使用ListForEach来展示和处理数据时,它们提供了许多灵活且功能丰富的方式。这些方式可以根据你的需求进行自定义,让你能够以不同的方式展示和组织数据。以下是一些示例来展示其灵活性和功能丰富性:

  1. 自定义列表项视图:

    • 你可以使用List配合自定义的列表项视图来展示数据。这样做可以让你完全控制列表项的外观和行为。

    示例代码:

    struct ContentView: View {
        struct Person {
            let id = UUID()
            let name: String
            let age: Int
        }
    
        let people = [
            Person(name: "John", age: 25),
            Person(name: "Alice", age: 30),
            Person(name: "Bob", age: 45)
        ]
    
        var body: some View {
            List(people, id: \.id) { person in
                VStack(alignment: .leading) {
                    Text(person.name)
                        .font(.headline)
                    Text("Age: \(person.age)")
                        .font(.subheadline)
                        .foregroundColor(.gray)
                }
            }
        }
    }
    

    在上述示例中,我们创建了一个自定义的Person结构体,并使用List来展示people数组中的每个个人。自定义列表项视图包含一个姓名和年龄的Text视图,并使用不同的字体和对齐方式。

  2. 动态删除和移动列表项:

    • 你可以使用onDeleteonMove修饰符让用户能够动态删除和移动列表中的项。

    示例代码:

    struct ContentView: View {
        @State private var tasks = ["Task 1", "Task 2", "Task 3"]
    
        var body: some View {
            List {
                ForEach(tasks, id: \.self) { task in
                    Text(task)
                }
                .onDelete { indexSet in
                    tasks.remove(atOffsets: indexSet)
                }
                .onMove { indices, newOffset in
                    tasks.move(fromOffsets: indices, toOffset: newOffset)
                }
            }
            .listStyle(InsetGroupedListStyle())
        }
    }
    

    在上述示例中,我们创建了一个可编辑的任务列表。通过使用onDelete修饰符,用户可以从列表中删除选定的项。通过使用onMove修饰符,用户可以重新排序列表中的项。

这些示例展示了ListForEach提供的灵活性和功能丰富性。通过自定义列表项视图以及使用动态删除和移动的功能,你可以根据自己的需求来展示和处理数据。这种灵活性使得你能够创建出丰富多样的用户界面,并提供更好的用户体验。

6. 导航和页面传递

在应用程序中实现导航和页面传递是常见的需求。在SwiftUI中,你可以使用NavigationViewNavigationLink来实现导航功能,并通过视图之间传递数据来实现页面传递。

以下是有关导航和页面传递的详细说明及示例:

  1. 导航功能:

    • 使用NavigationView视图可以创建一个导航容器,它提供了导航栏和导航层次结构的支持。你可以在NavigationView中包裹其他视图,并使用NavigationLink来定义导航链接。

    示例代码:

    struct ContentView: View {
        var body: some View {
            NavigationView {
                VStack {
                    Text("Home View")
                    NavigationLink(destination: DetailView()) {
                        Text("Go to Detail View")
                    }
                }
                .navigationTitle("Main")
            }
        }
    }
    
    struct DetailView: View {
        var body: some View {
            VStack {
                Text("Detail View")
            }
            .navigationTitle("Detail")
        }
    }
    

    在上述示例中,我们创建了一个简单的导航界面。在NavigationView中,我们将VStack作为主页视图,其中包含一个导航链接NavigationLink。点击链接后,将导航到DetailView

  2. 页面传递:

    • 使用NavigationLink时,你可以通过在目标视图中接收属性来传递数据。这可以通过在NavigationLink的目标视图中使用init方法接收传递的属性来实现。

    示例代码:

    struct ContentView: View {
        var body: some View {
            NavigationView {
                VStack {
                    Text("Home View")
                    NavigationLink(destination: DetailView(name: "John")) {
                        Text("Go to Detail View")
                    }
                }
                .navigationTitle("Main")
            }
        }
    }
    
    struct DetailView: View {
        var name: String
    
        var body: some View {
            VStack {
                Text("Detail View")
                Text("Hello, \(name)!")
            }
            .navigationTitle("Detail")
        }
    }
    

    在上述示例中,我们通过在NavigationView中的NavigationLink中传递名为"John"的属性,在DetailView中接收并显示该属性。

通过实现导航和页面传递,你可以在应用程序中创建多个视图,并使之彼此之间可以通过导航进行转换,同时还可以通过传递数据在视图之间进行交互。

7. 动画和过渡效果

动画和过渡效果可以为应用程序增加生动性和交互性,并提升用户体验。在SwiftUI中,你可以使用内置的动画修饰符以及过渡效果来实现各种动画效果。

以下是关于动画和过渡效果的详细说明:

  1. 基本动画:

    • SwiftUI提供了许多内置的动画修饰符,例如animation()。你可以将其应用于视图上的操作和属性,以在界面上创建动画效果。

    示例代码:

    struct ContentView: View {
        @State private var scale: CGFloat = 1.0
    
        var body: some View {
            Button("Animate") {
                withAnimation {
                    scale += 0.5
                }
            }
            .padding(20)
            .background(Color.blue)
            .foregroundColor(.white)
            .scaleEffect(scale)
        }
    }
    

    在上述示例中,我们创建了一个按钮,当用户点击按钮时,将使用渐变动画将按钮的比例scale增加0.5。通过使用withAnimation修饰符,我们告诉SwiftUI在该状态更改期间应用动画效果。

  2. 过渡效果:

    • SwiftUI提供了一些内置的过渡效果,如transition()matchedGeometryEffect(),以实现在视图之间进行平滑的过渡效果。

    示例代码:

    struct ContentView: View {
        @State private var showRectangle = false
    
        var body: some View {
            VStack {
                if showRectangle {
                    Rectangle()
                        .frame(width: 200, height: 200)
                        .transition(.scale)
                }
    
                Button("Toggle Rectangle") {
                    withAnimation {
                        showRectangle.toggle()
                    }
                }
                .padding(20)
                .background(Color.blue)
                .foregroundColor(.white)
            }
        }
    }
    

    在上述示例中,我们创建了一个按钮以切换一个矩形的显示。当用户点击按钮时,使用渐变的缩放效果(.scale)来显示或隐藏矩形。

通过使用动画修饰符和过渡效果,你可以为应用程序创建各种动态和平滑的视觉效果,从而增强用户体验。

8. 手势和交互

手势和交互是移动应用程序中的重要组成部分,它们使用户能够与应用程序进行直接的、可触摸的交互。在SwiftUI中,你可以使用内置的手势修饰符来实现各种交互行为。

以下是关于手势和交互的详细说明:

  1. Tap手势:

    • onTapGesture手势修饰符可以用于捕获用户点击视图的动作。

    示例代码:

    struct ContentView: View {
        @State private var isTapped = false
    
        var body: some View {
            Circle()
                .frame(width: 100, height: 100)
                .foregroundColor(isTapped ? .blue : .red)
                .onTapGesture {
                    isTapped.toggle()
                }
        }
    }
    

    在上述示例中,我们创建了一个圆圈,并设置其背景颜色为红色。当用户点击圆圈时,使用onTapGesture捕获点击事件,并切换圆圈的背景颜色为蓝色。

  2. 拖动手势:

    • gesture修饰符可以用于给视图添加拖动手势。

    示例代码:

    struct ContentView: View {
        @State private var offset = CGSize.zero
    
        var body: some View {
            Circle()
                .frame(width: 100, height: 100)
                .foregroundColor(.blue)
                .offset(offset)
                .gesture(
                    DragGesture()
                        .onChanged { value in
                            offset = value.translation
                        }
                        .onEnded { _ in
                            offset = .zero
                        }
                )
        }
    }
    

    在上述示例中,我们创建了一个圆圈,并使用offset属性控制该圆圈的位置。通过给圆圈添加gesture修饰符,并使用DragGesture捕获拖动手势,可以使用户能够拖动圆圈来改变其位置。

通过利用手势修饰符,你可以为视图添加各种交互行为,包括点击、拖动、捏取等。这使得用户可以直接、自然地与应用程序进行交互。

9. 绘制和绘图

Drawing and graphics are important techniques in iOS app development that allow you to create custom shapes and visual effects. In SwiftUI, you can achieve drawing and graphics by using the Path and Shape protocol.

Here is a detailed explanation of drawing and graphics:

  1. Drawing basic shapes:

    • The Path type in SwiftUI represents a path, and you can use it to create and combine basic shapes.

    Example code:

    struct ContentView: View {
        var body: some View {
            Path { path in
                path.move(to: CGPoint(x: 50, y: 50))
                path.addLine(to: CGPoint(x: 100, y: 100))
                path.addLine(to: CGPoint(x: 150, y: 50))
            }
            .stroke(Color.blue, lineWidth: 2)
        }
    }
    

    In the above example, we use Path to create a simple triangular shape. By calling the move(to:) and addLine(to:) methods, we specify the vertices of the triangle. Finally, we use the stroke() modifier to render the shape with a blue border.

  2. Creating custom shapes:

    • In SwiftUI, you can also create custom shapes by implementing the Shape protocol.

    Example code:

    struct ContentView: View {
        var body: some View {
            Triangle()
                .fill(Color.red)
                .frame(width: 200, height: 200)
        }
    }
    
    struct Triangle: Shape {
        func path(in rect: CGRect) -> Path {
            var path = Path()
            path.move(to: CGPoint(x: rect.midX, y: rect.minY))
            path.addLine(to: CGPoint(x: rect.maxX, y: rect.maxY))
            path.addLine(to: CGPoint(x: rect.minX, y: rect.maxY))
            path.closeSubpath()
            return path
        }
    }
    

    In the above example, we create a custom triangle shape by implementing the Shape protocol. In the path(in:) method, we use the Path type to create a path with three vertices and close the path with the closeSubpath() method. Finally, we add the custom shape to the view hierarchy and set the fill color using the fill() modifier.

By utilizing drawing and graphics, you can create graphics with custom shapes and visual effects. This allows you to implement various interesting and unique interface designs.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/973928.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

rac异常hang死故障分析(sskgxpsnd2)

x86虚拟化的平台麒麟系统的一套RAC。事件梳理20:24左右,发现一个节点hang死,关闭操作没有响应。关闭hang死节点,另一个节点也发生hang死,然后重启了另一个节点。 无效分析部分 检查gi的alert日志 有一个很大跨度的时间回退 再看…

辛普森近似求值

辛普森近似求解 公式证明任意一个对称区间的一元二次函数定积分拆分求和:strawberry: 总结 : 如果我们把六分之一乘进去我们只不过在指定的区间采集数据六个求平均,乘以采集数据区间的微元宽度(历史上不少的手稿用h,翻译为微元高度&#xff0…

Python虚拟环境venv下安装playwright介绍及记录

playwright介绍 Playwright是一个用于自动化Web浏览器测试和Web数据抓取的开源库。它由Microsoft开发,支持Chrome、Firefox、Safari、Edge和WebKit浏览器。Playwright的一个主要特点是它能够在所有主要的操作系统(包括Windows、Linux和macOS&#xff09…

OS 磁盘 从生磁盘到文件 文件使用磁盘

通过磁头和磁盘的电生磁,磁生电来写读通过往控制器写入扇区sect 磁头head 柱面port 等位置,通过DMA总线盗用技术,将信息读入内存或写入磁盘,重点在于传递数值,使用out指令,将几个信息拼接起来 寻道&#xf…

正中优配:消费电子概念走高,捷荣技术斩获5连板,凯旺科技等大涨

消费电子概念5日盘中走势活泼,截至发稿,凯旺科技涨超12%,华映科技、合力泰、瀛通通讯、捷荣技能、实益达等涨停,信维通讯涨超8%。值得注意的是,捷荣技能已连续5个交易日涨停,华映科技4日斩获3板。 消息面上…

【RabbitMQ】介绍及消息收发流程

介绍 RabbitMQ 是实现 AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。 RabbitMQ 主要是为了实现系统之间的双向解耦而实…

【校招VIP】前端专业课考点之CSMA/CD协议

考点介绍: CSMA/CD,载波监听多点接入/碰撞检测,是广播型信道中采用一种随机访问技术的竞争型访问方法,具有多目标地址的特点。它通过边发送数据边监听线路的方法来尽可能减少数据碰撞与冲突。采用分布式控制方法,所有结…

QT 一个简易闹钟

1 效果图 pro QT core gui texttospeechgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11# The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated (the exact warnings # depend on your c…

PE文件格式详解

摘要 本文描述了Windows系统的PE文件格式。 PE文件格式简介 PE(Portable Executable)文件格式是一种Windows操作系统下的可执行文件格式。PE文件格式是由Microsoft基于COFF(Common Object File Format)格式所定义的&#xff0c…

16|女性视角:李清照笔下独到的细腻

好诗相伴,千金不换。你好,我是天博。 前面我们说了这一章的主题是“见众生”,见众生就是读诗词里的人性。截止到现在,我们已经感受了杜甫面对人民的悲悯,刘禹锡面对贬谪的耿直,而今天这一讲,我…

智能合约安全,著名的区块链漏洞:双花攻击

智能合约安全,著名的区块链漏洞:双花攻击 介绍: 区块链技术通过提供去中心化和透明的系统彻底改变了各个行业。但是,与任何技术一样,它也不能免受漏洞的影响。一个值得注意的漏洞是双花攻击。在本文中,我们将深入研究…

告别复杂的绘画软件!选择Growly Draw for Mac,让你的创作更轻松

Growly Draw for mac是一款快速绘画应用,让你可以在Mac电脑上轻松创作美丽的绘画作品。这个应用程序并不像Photoshop那样拥有丰富的功能,但它的简约设计使得那些基本的绘画任务变得轻松便捷。 如果你对绘画充满热情,但缺乏专业的绘画技巧&am…

Python调用Jumpserver的Api接口增删改查

引言 Jumpserver是一款强大的堡垒机系统,可以有效管理和控制企业内部服务器的访问权限,提高网络安全性。本文将介绍如何使用Python编程语言,结合Jumpserver提供的API接口,实现对跳板机的管理和操作。 1、什么是Jumpserver&#…

气传导耳机怎么样?市面上热门气传导耳机推荐

​气传导耳机不仅能够提升幸福感还能听到周围环境声,大大提高安全性。如果你在寻找一款高品质的气传导耳机,又不知从何入手时,不要担心,我已经为你精心挑选了四款市面上综合表现很不错的气传导耳机,让你享受更好的音质…

达梦类型转换问题-float转换为varchar

表结构 CREATE TABLE "SYSDBA"."TABLE_2" ( "COLUMN_1" FLOAT, "COLUMN_2" NUMERIC(22,6)) STORAGE(ON "MAIN", CLUSTERBTR) ; 表数据: 查询,将numeric转换为float,再转换为varchar&…

Spring Boot 整合 Redis,使用 RedisTemplate 客户端

文章目录 一、SpringBoot 整合 Redis1.1 整合 Redis 步骤1.1.1 添加依赖1.1.2 yml 配置文件1.1.3 Config 配置文件1.1.4 使用示例 1.2 RedisTemplate 概述1.2.1 RedisTemplate 简介1.2.2 RedisTemplate 功能 二、RedisTemplate API2.1 RedisTemplate 公共 API2.2 String 类型 A…

通讯行业:看完这篇文章,我的认知被刷新了!

在现代社会中,通讯系统已经成为我们生活中不可或缺的一部分,它们支撑着信息传递、数据交流和社交互动。然而,通讯系统的可靠性和连续性依赖于电源的稳定供应。电源中断或波动可能导致通讯中断,给个人、企业和组织带来巨大的不便和…

Java版企业电子招标采购系统源码Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis

功能描述 1、门户管理:所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含:招标公告、非招标公告、系统通知、政策法规。 2、立项管理:企业用户可对需要采购的项目进行立项申请,并提交审批,查看…

港陆证券:服装家纺公司上半年投资并购力度加大

9月1日,嘉曼服饰发布公告,为完善多品牌差异化开展战略,将以自有资金收买暇步士(Hush Puppies)品牌我国内地及香港、澳门区域IP财物。 面对服饰市场的激烈竞争,本年以来一些服饰类A股公司开启了“买买买”形…

西贝餐饮集团贺赞贤:Smartbi及指标体系的应用助力销供产业务协同

“传统的供应链数字化运营,是自下而上的需求驱动,存在效率低下、口径不统一、分析不敏捷等问题。西贝亟需自上而下构建完善科学的指标体系,实现敏捷、灵活、统一的应用。因此借助Smartbi以指标为核心的一站式ABI平台,梳理指标体系…