【面试系列】Swift 高频面试题及详细解答

欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏:

⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题.
⭐️ AIGC时代的创新与未来:详细讲解AIGC的概念、核心技术、应用领域等内容。
⭐️ 全流程数据技术实战指南:全面讲解从数据采集到数据可视化的整个过程,掌握构建现代化数据平台和数据仓库的核心技术和方法。

文章目录

    • Swift 初级面试题及详细解答
      • 1. 什么是 Swift 中的常量和变量?它们有什么区别?
      • 2. Swift 中的数组和字典有什么区别?如何创建它们?
      • 3. 如何在 Swift 中定义一个函数?请举例说明。
      • 4. Swift 中的可选值是什么?如何使用?
      • 5. 如何在 Swift 中使用条件语句?
      • 6. 什么是 Swift 中的闭包?请提供一个简单的示例。
      • 7. Swift 中的 `struct` 和 `class` 有什么区别?
      • 8. 如何在 Swift 中实现循环?
      • 9. Swift 中的协议是什么?如何定义和使用协议?
      • 10. Swift 中的扩展 (Extensions) 是什么?如何使用它们?
    • Swift 中级面试题及详细解答
      • 1. 解释 Swift 中的类型推断和类型安全。
      • 2. Swift 中的 `guard` 语句是什么?它如何工作?
      • 3. 如何在 Swift 中处理错误?描述 `throws` 和 `try` 关键字的用法。
      • 4. 什么是 Swift 中的泛型?请提供一个简单的泛型函数示例。
      • 5. 解释 Swift 中的内存管理和 ARC(自动引用计数)。
      • 6. 如何在 Swift 中实现多线程?介绍 `GCD` 和 `NSOperation`。
      • 7. Swift 中的 `lazy` 属性是什么?它有什么作用?
      • 8. 解释 Swift 中的协议扩展及其应用。
      • 9. 什么是 `defer` 语句?在什么情况下使用?
      • 10. 解释 Swift 中的值类型和引用类型,举例说明。
    • Swift 高级面试题及详细解答
      • 1. 解释 Swift 中的类型擦除(Type Erasure),并举例说明如何实现。
      • 2. 什么是 Swift 中的关联类型(Associated Types)?请举例说明其用途。
      • 3. 解释 Swift 中的 `Result` 类型及其优点,并举例说明如何使用。
      • 4. 如何在 Swift 中实现依赖注入(Dependency Injection)?
      • 5. 解释 Swift 中的 `@propertyWrapper`,并提供一个自定义属性包装器的示例。
      • 6. Swift 中的 `@autoclosure` 关键字是什么?它的作用是什么?
      • 7. 什么是 Swift 中的内存泄漏?如何使用工具检测和防止内存泄漏?
      • 8. 解释 Swift 中的元类型(Meta Type),并举例说明其应用。
      • 9. 什么是 Swift 中的动态派发?如何实现?
      • 10. 解释 Swift 中的 `@escaping` 闭包及其用法。
    • 常见知识点总结
      • 基础知识
      • 函数和闭包
      • 面向对象编程
      • 内存管理
      • 异步编程
      • 泛型和高级类型
      • 错误处理
      • 属性和属性观察
      • 元编程
      • 设计模式和架构
      • 调试和测试

Swift 初级面试题及详细解答

1. 什么是 Swift 中的常量和变量?它们有什么区别?

在 Swift 中,常量使用 let 声明,变量使用 var 声明。常量一旦赋值就不能改变,而变量可以在其生命周期内随时改变值。

let constantValue = 10
var variableValue = 20
variableValue = 30 // 有效
constantValue = 40 // 编译错误

2. Swift 中的数组和字典有什么区别?如何创建它们?

数组是一种有序集合,字典是一种无序的键值对集合。数组使用 [] 创建,字典使用 [:] 创建。

let array = [1, 2, 3]
let dictionary = ["key1": "value1", "key2": "value2"]

3. 如何在 Swift 中定义一个函数?请举例说明。

函数使用 func 关键字定义,包含函数名、参数和返回类型。

func greet(name: String) -> String {return "Hello, \(name)!"
}
let greeting = greet(name: "Alice") // 输出: "Hello, Alice!"

4. Swift 中的可选值是什么?如何使用?

可选值表示变量可能有值也可能为 nil。使用 ? 声明可选类型,使用 ! 解包。

var optionalValue: Int? = 5
if let value = optionalValue {print("Value is \(value)")
}

5. 如何在 Swift 中使用条件语句?

使用 ifelse ifelse 语句进行条件判断。

let number = 10
if number > 0 {print("Positive")
} else if number < 0 {print("Negative")
} else {print("Zero")
}

6. 什么是 Swift 中的闭包?请提供一个简单的示例。

闭包是自包含的代码块,可以在代码中传递和使用。闭包可以捕获和存储其上下文中的常量和变量。

let closure = { (name: String) -> String inreturn "Hello, \(name)!"
}
let result = closure("Bob") // 输出: "Hello, Bob!"

7. Swift 中的 structclass 有什么区别?

struct 是值类型,class 是引用类型。struct 赋值会创建副本,而 class 赋值会共享同一实例。

struct MyStruct {var value: Int
}
class MyClass {var value: Intinit(value: Int) {self.value = value}
}var struct1 = MyStruct(value: 10)
var struct2 = struct1
struct2.value = 20
print(struct1.value) // 输出: 10var class1 = MyClass(value: 10)
var class2 = class1
class2.value = 20
print(class1.value) // 输出: 20

8. 如何在 Swift 中实现循环?

使用 for-inwhilerepeat-while 循环进行迭代。

let array = [1, 2, 3]
for element in array {print(element)
}var counter = 0
while counter < 3 {print(counter)counter += 1
}counter = 0
repeat {print(counter)counter += 1
} while counter < 3

9. Swift 中的协议是什么?如何定义和使用协议?

协议定义了一个蓝图,规定了特定任务或功能的方法和属性。类、结构体或枚举可以遵循协议。

protocol Greetable {func greet() -> String
}class Person: Greetable {func greet() -> String {return "Hello!"}
}let person = Person()
print(person.greet()) // 输出: "Hello!"

10. Swift 中的扩展 (Extensions) 是什么?如何使用它们?

扩展可以为已有的类、结构体、枚举或协议添加新功能,而不需要修改源代码。

extension String {func reversedString() -> String {return String(self.reversed())}
}let original = "Swift"
let reversed = original.reversedString() // 输出: "tfiwS"

Swift 中级面试题及详细解答

1. 解释 Swift 中的类型推断和类型安全。

Swift 使用类型推断来自动推断变量和常量的类型,确保类型安全。这意味着在声明时不需要明确指定类型,编译器会根据赋值自动推断类型,从而减少错误和提高代码安全性。

let number = 42 // 自动推断为 Int
let message = "Hello, World!" // 自动推断为 String

2. Swift 中的 guard 语句是什么?它如何工作?

guard 语句用于提前退出代码块,以确保一定条件为真。通常在函数中使用 guard 来验证条件,如果条件不满足,则退出当前作用域。

func greet(person: String?) {guard let name = person else {print("No name provided")return}print("Hello, \(name)!")
}
greet(person: "Alice") // 输出: "Hello, Alice!"
greet(person: nil) // 输出: "No name provided"

3. 如何在 Swift 中处理错误?描述 throwstry 关键字的用法。

Swift 使用 throws 声明可能会抛出错误的函数,try 关键字调用可能会抛出错误的函数。可以使用 do-catch 块来捕获和处理错误。

enum FileError: Error {case notFound
}func readFile(filename: String) throws -> String {if filename.isEmpty {throw FileError.notFound}return "File content"
}do {let content = try readFile(filename: "data.txt")print(content)
} catch {print("Error reading file: \(error)")
}

4. 什么是 Swift 中的泛型?请提供一个简单的泛型函数示例。

泛型允许创建灵活且可重用的函数和类型,能够适用于任何类型。泛型参数用尖括号 <> 包围。

func swapValues<T>(_ a: inout T, _ b: inout T) {let temp = aa = bb = temp
}var x = 5
var y = 10
swapValues(&x, &y)
print("x: \(x), y: \(y)") // 输出: "x: 10, y: 5"

5. 解释 Swift 中的内存管理和 ARC(自动引用计数)。

Swift 使用 ARC 来管理内存,通过跟踪和管理应用程序的对象生命周期。ARC 会自动增加和减少引用计数,当引用计数为零时,释放对象的内存。ARC 主要用于防止内存泄漏。

class Person {let name: Stringinit(name: String) {self.name = nameprint("\(name) is being initialized")}deinit {print("\(name) is being deinitialized")}
}var person1: Person? = Person(name: "John")
person1 = nil // 输出: "John is being deinitialized"

6. 如何在 Swift 中实现多线程?介绍 GCDNSOperation

Swift 提供了 Grand Central Dispatch(GCD)和 NSOperation 用于多线程编程。GCD 使用轻量级的 API 管理并发任务,而 NSOperation 提供更高层次的任务管理和依赖关系。

DispatchQueue.global(qos: .background).async {print("Background Task")DispatchQueue.main.async {print("Main Thread Task")}
}let operationQueue = OperationQueue()
let operation = BlockOperation {print("Operation Task")
}
operationQueue.addOperation(operation)

7. Swift 中的 lazy 属性是什么?它有什么作用?

lazy 属性在第一次访问时才会被初始化。常用于需要延迟初始化的计算量大的属性或依赖于其他属性的属性。

class DataManager {lazy var data = loadData()func loadData() -> String {return "Data loaded"}
}let manager = DataManager()
print(manager.data) // 输出: "Data loaded"

8. 解释 Swift 中的协议扩展及其应用。

协议扩展为协议添加方法和属性的实现,允许所有遵循该协议的类型共享这些实现。它提供了一种在不修改类型的情况下添加通用功能的方式。

protocol Greetable {func greet()
}extension Greetable {func greet() {print("Hello!")}
}struct Person: Greetable {}
let person = Person()
person.greet() // 输出: "Hello!"

9. 什么是 defer 语句?在什么情况下使用?

defer 语句用于在当前作用域结束时执行代码块。常用于资源管理,如关闭文件或释放锁。

func processFile() {print("Opening file")defer {print("Closing file")}print("Processing file")
}
processFile()
// 输出: "Opening file"
//      "Processing file"
//      "Closing file"

10. 解释 Swift 中的值类型和引用类型,举例说明。

值类型在赋值或传递时会创建副本,引用类型在赋值或传递时会共享同一个实例。结构体和枚举是值类型,类是引用类型。

struct Point {var x: Intvar y: Int
}class Circle {var radius: Intinit(radius: Int) {self.radius = radius}
}var point1 = Point(x: 0, y: 0)
var point2 = point1
point2.x = 10
print(point1.x) // 输出: 0var circle1 = Circle(radius: 5)
var circle2 = circle1
circle2.radius = 10
print(circle1.radius) // 输出: 10

Swift 高级面试题及详细解答

1. 解释 Swift 中的类型擦除(Type Erasure),并举例说明如何实现。

类型擦除是将特定类型隐藏在公共接口背后的技术。常用于泛型协议,使得具体类型对使用者不可见。通过类型擦除,可以将不同类型的实例统一为同一接口类型。

protocol AnyPrintable {func printValue()
}struct TypeErased<T>: AnyPrintable {private let _printValue: () -> Voidinit<U: AnyPrintable>(_ wrapped: U) where U == T {_printValue = wrapped.printValue}func printValue() {_printValue()}
}struct StringWrapper: AnyPrintable {let value: Stringfunc printValue() {print(value)}
}let stringWrapper = StringWrapper(value: "Hello")
let anyPrintable: AnyPrintable = TypeErased(stringWrapper)
anyPrintable.printValue() // 输出: Hello

2. 什么是 Swift 中的关联类型(Associated Types)?请举例说明其用途。

关联类型是协议中的占位符类型,定义协议时使用 associatedtype 关键字。它允许协议在不指定具体类型的情况下定义方法和属性,使协议更具灵活性和通用性。

protocol Container {associatedtype ItemTypemutating func append(_ item: ItemType)var count: Int { get }subscript(i: Int) -> ItemType { get }
}struct IntStack: Container {var items = [Int]()mutating func append(_ item: Int) {items.append(item)}var count: Int {return items.count}subscript(i: Int) -> Int {return items[i]}
}var stack = IntStack()
stack.append(1)
stack.append(2)
print(stack[0]) // 输出: 1

3. 解释 Swift 中的 Result 类型及其优点,并举例说明如何使用。

Result 类型表示一个操作的成功或失败,具有 .success.failure 两种状态。它改善了错误处理,使得代码更具可读性和健壮性。

enum NetworkError: Error {case badURLcase requestFailed
}func fetchData(from url: String) -> Result<String, NetworkError> {guard url != "" else {return .failure(.badURL)}// 假设请求成功return .success("Data from \(url)")
}let result = fetchData(from: "https://example.com")
switch result {
case .success(let data):print("Received data: \(data)")
case .failure(let error):print("Failed with error: \(error)")
}

4. 如何在 Swift 中实现依赖注入(Dependency Injection)?

依赖注入是一种设计模式,通过构造函数或属性注入所需的依赖,以提高代码的可测试性和模块化。常用的方法有构造函数注入和属性注入。

protocol Service {func performAction()
}class MyService: Service {func performAction() {print("Action performed")}
}class Client {let service: Serviceinit(service: Service) {self.service = service}func execute() {service.performAction()}
}let myService = MyService()
let client = Client(service: myService)
client.execute() // 输出: Action performed

5. 解释 Swift 中的 @propertyWrapper,并提供一个自定义属性包装器的示例。

@propertyWrapper 是一个 Swift 特性,允许你定义一个结构体或类来封装属性的读写逻辑,从而复用属性行为。

@propertyWrapper
struct Capitalized {private var value: String = ""var wrappedValue: String {get { value }set { value = newValue.capitalized }}
}struct User {@Capitalized var name: String
}var user = User(name: "john doe")
print(user.name) // 输出: John Doe

6. Swift 中的 @autoclosure 关键字是什么?它的作用是什么?

@autoclosure 将表达式自动封装为闭包,延迟执行,常用于简化 API 调用。它减少了显式闭包的使用,使代码更简洁。

func logIfTrue(_ predicate: @autoclosure () -> Bool) {if predicate() {print("Condition is true")}
}let value = 5
logIfTrue(value > 3) // 输出: Condition is true

7. 什么是 Swift 中的内存泄漏?如何使用工具检测和防止内存泄漏?

内存泄漏是未被释放的内存,导致应用程序内存使用增加。常见原因是强引用循环。使用 Xcode 的 Instruments 工具中的 Leaks 和 Allocations 检测和分析内存泄漏。

class ClassA {var b: ClassB?
}class ClassB {var a: ClassA?
}var a: ClassA? = ClassA()
var b: ClassB? = ClassB()a?.b = b
b?.a = aa = nil
b = nil
// 由于相互强引用,内存泄漏发生

8. 解释 Swift 中的元类型(Meta Type),并举例说明其应用。

元类型是类型的类型,表示某个类型本身。使用 .self.Type 访问元类型,常用于反射和动态类型操作。

class MyClass {class func classMethod() {print("Class method called")}
}let type: MyClass.Type = MyClass.self
type.classMethod() // 输出: Class method calledfunc printTypeName(_ type: Any.Type) {print("Type: \(type)")
}printTypeName(String.self) // 输出: Type: String

9. 什么是 Swift 中的动态派发?如何实现?

动态派发是运行时决定调用哪个方法的机制。Swift 默认使用静态派发,通过 @objcdynamic 关键字可以启用动态派发,用于与 Objective-C 互操作或需要动态调用的场景。

class Parent {@objc dynamic func greet() {print("Hello from Parent")}
}class Child: Parent {override func greet() {print("Hello from Child")}
}let parent: Parent = Child()
parent.greet() // 输出: Hello from Child (动态派发)

10. 解释 Swift 中的 @escaping 闭包及其用法。

@escaping 标记的闭包可以在函数返回后被调用,常用于异步操作或存储闭包。没有 @escaping 的闭包只能在函数内部调用。

func performAsyncTask(completion: @escaping () -> Void) {DispatchQueue.global().async {// 执行一些异步操作completion() // 在异步操作完成后调用闭包}
}performAsyncTask {print("Async task completed")
}

常见知识点总结

在 Swift 面试中,需要掌握的知识点涵盖了从基础到高级的多个方面,确保你能够编写高效、健壮、可维护的代码。以下是详细总结:

基础知识

  1. 变量和常量:理解 varlet 的区别,变量是可变的,常量是不可变的。
  2. 数据类型:熟悉基本数据类型(如 Int、Double、String、Bool 等)和集合类型(如 Array、Dictionary、Set)。
  3. 控制流:掌握 ifelseswitchfor-inwhilerepeat-while 等控制流结构。

函数和闭包

  1. 函数定义和调用:理解函数的定义、参数和返回类型,以及如何调用函数。
  2. 闭包:掌握闭包的定义、用法和捕获值的特性,理解逃逸闭包 (@escaping) 的概念。

面向对象编程

  1. 类和结构体:理解类 (class) 和结构体 (struct) 的区别和使用场景,构造函数的定义。
  2. 继承:掌握类的继承,了解方法重写 (override) 和子类化。
  3. 协议和扩展:理解协议 (protocol) 的定义和用法,协议扩展的概念和应用。

内存管理

  1. 自动引用计数 (ARC):理解 ARC 的工作机制,如何避免强引用循环,使用 weakunowned 解决引用循环问题。
  2. 内存泄漏检测:熟悉使用 Xcode 的 Instruments 工具进行内存泄漏检测。

异步编程

  1. Grand Central Dispatch (GCD):掌握 GCD 的基本用法,如何在不同队列上调度任务。
  2. NSOperation 和 NSOperationQueue:了解使用 NSOperation 和 NSOperationQueue 进行更高级的任务管理。

泛型和高级类型

  1. 泛型:理解泛型的定义和用法,如何编写泛型函数和泛型类型。
  2. 类型擦除:掌握类型擦除的概念,如何通过类型擦除解决泛型协议的类型限制问题。
  3. 关联类型:理解协议中的关联类型 (associatedtype),如何在协议中使用关联类型来定义灵活的接口。

错误处理

  1. 错误处理机制:掌握 Swift 的错误处理机制,包括 throwstrydo-catch 结构。
  2. Result 类型:理解 Result 类型的用法,如何使用 Result 处理返回值和错误。

属性和属性观察

  1. 属性包装器 (@propertyWrapper):理解属性包装器的概念和用法,如何创建自定义属性包装器。
  2. 属性观察器:掌握 willSetdidSet 的使用场景和用法。

元编程

  1. 元类型 (Meta Type):理解元类型的概念,如何使用 .self.Type 进行元类型操作。
  2. 动态派发:掌握动态派发的概念,如何使用 @objcdynamic 实现动态派发。

设计模式和架构

  1. 常见设计模式:熟悉单例、观察者、工厂等常见设计模式的实现和应用场景。
  2. 架构模式:了解 MVC、MVVM 等架构模式在 Swift 开发中的应用。

调试和测试

  1. 调试技巧:掌握使用 Xcode 进行调试,设置断点,查看变量值等调试技巧。
  2. 单元测试和 UI 测试:理解如何编写单元测试和 UI 测试,使用 XCTest 框架进行测试。

掌握上述知识点,能够帮助你在 Swift 面试中游刃有余,展示出扎实的技术基础和实践经验,进而在竞争中脱颖而出。


💗💗💗 如果觉得这篇文对您有帮助,请给个点赞、关注、收藏吧,谢谢!💗💗💗

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

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

相关文章

ArUco 相关(opencv)

主要的问题还是随着opencv的版本升级&#xff0c;对aruco模块的函数命名变化挺大的&#xff0c;因此需要正确调用opencv对应版本下的aruco相关函数&#xff0c;不然程序无法运行&#xff0c;会报各种异常 在线ArUco工具 https://chev.me/arucogen/ 保存下来的是svg格式 环境 …

Linux常见操作问题

1、登录刚创建的用户&#xff0c;无法操作。 注&#xff1a;etc/passwd文件是Linux操作系统中存储用户账户信息的文本文件&#xff0c;包含了系统中所有用户的基本信息&#xff0c;比如用户名、用户ID、用户组ID、用户家目录路径。 注&#xff1a;etc: 这个目录存放所有的系统…

Android关机闹钟的实现原理以及基于高通的实现

最近新到了一家公司, 做手机的rom, 刚来被分配做改造DeckClock这个部分以便熟悉整个代码环境.里面包含闹钟, 世界时钟, 定时器, 秒表四块. 我们是基于OnePlus的rom的基础上进行修改. 当我看到产品说关机闹钟相关的东西的时候, 因为之前懂一些关于RTC的东西, 就说这个是要基于RT…

Java工具包——Lombok

目录 1. maven仓库手动导入依赖注解 1.1 maven仓库引入依赖 1.2 在类上使用Data注解 1.3 在属性上使用Getter与Setter注解 2. EditStarters插件注解 2.1 安装EditStarters插件 2.2 在pom.xml中进行操作 2.3 在java对象类中使用注解 3. lombok工具使用结果查看 3.1…

腾讯云CVM,CentOS8系统下部署Java-Web项目步骤详解

在CVM中部署项目首先要配置好JDK,Tomcat,Mysql(这里以Tomcat和Mysql为例)。部署JDK和Tomcat的步骤可以参考 CentOS7系统下部署tomcat,浏览器访问localhost:8080/_不积跬步&#xff0c;无以至千里&#xff1b;不积小流&#xff0c;无以成江河。-CSDN博客 我这里从Mysql的安装和设…

HDOJ5616 Jam‘s balance

目录 HDOJ5616 Jams balance题目描述背景输入输出 题解解法一解法二优化 打赏 HDOJ5616 Jam’s balance 题目描述 背景 有 N N N个已知质量的砝码&#xff0c;分别询问给出的 M M M个质量能否被称出 输入 第一行输入一个变量 T T T&#xff0c;表示有 T T T组数据&#xf…

数据预处理功能教程,上传文件生成知识库 | Chatopera

如何快速的生成高质量的知识库&#xff1f; 数据预处理功能教程 | Chatopera 云服务低代码定制聊天机器人 关于 Chatopera Chatopera 云服务重新定义聊天机器人&#xff0c;https://bot.chatopera.com 定制智能客服、知识库、AI 助手、智慧家居等智能应用&#xff0c;释放创新…

【java算法专场】双指针(上)

目录 前言 基本原理 对撞指针 快慢指针 移动零 算法思路 算法步骤 代码实现 算法分析 复写零 算法思路 算法步骤 代码实现 快乐数 算法思路 算法步骤 代码实现 盛最多水的容器 ​编辑算法思路 代码实现 前言 双指针是一种在数组或链表等线性数据结构中高效…

Unity使用Fmod的线程安全大坑!

对EventInstance设置回调函数时&#xff0c;回调函数内不能调用协程。否则会秒崩溃&#xff0c;并且不带任何报错&#xff01; 协程在主线程中执行&#xff0c;但是事件回调是异步在音频线程中执行的 Event Callbacks 某些 EVENT_CALLBACK_TYPE 回调会在音频线程中执行,比如 …

Axure 教程 | 雅虎新闻焦点

主要内容 在雅虎首页&#xff0c;新闻焦点大图和焦点小图同步切换轮播&#xff0c;本课程我们来学习如何实现这个效果。 交互说明 1.页面载入后&#xff0c;切换当前屏幕显示的5张焦点图&#xff0c;小图标处以横线提示当前焦点图。 2.鼠标移入焦点大图&#xff0c;新闻标题显示…

水平拆分的技巧

水平拆分的原则和技巧 水平拆分是一种常见的数据库优化手段&#xff0c;它涉及到将一个大型表根据特定的字段值拆分成多个较小的表。这种做法可以有效地提高查询效率&#xff0c;尤其是在处理大量数据时。以下是一些关于如何根据业务设计字段进行水平拆分的建议&#xff1a; …

马斯克的SpaceX星舰有多牛?我们离殖民火星还有多远?

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 埃隆马斯克是一位知名的企业家和工程师&#xff0c;他掌握着多家公司&#xff0c;涉及多个领域&#xff0c;包括电动汽车、太空探索、太阳能、脑…

Charles 证书迁移/复制,实现手机安装一次证书可以连接多个设备的 charles 效果

如果你希望在一个手机上安装一次证书&#xff0c;但是使用这个手机可能在不同的时候去连接你自己安装了Charles的不同设备。比如你在公司有有一个电脑&#xff0c;你在家里也有一个电脑&#xff0c;甚至还有一个笔记本等。 如果想实现只给手机安装一次证书&#xff0c;就可以都…

告别数据线!轻松实现iOS和安卓设备间的文件共享

用 AirDroid 的附近传输功能&#xff0c;完全免费&#xff0c;几十个G的文件也可以相互传输。不限制iPhone和iPad数量&#xff0c;多个设备同时登录也不会强迫下线。 当你要在苹果手机和安卓手机之间传输文件&#xff0c;请将AirDroid安装到两台手机上&#xff0c;然后登录同一…

从零开始:STM32与W25Q64 Flash存储器的SPI接口全解析

摘要 本文将从基础出发&#xff0c;全面解析STM32微控制器与W25Q64 Flash存储器通过SPI接口的通信。内容包括SPI基础知识、W25Q64特性、硬件连接、SPI接口配置、读写操作及实际代码示例。 1. SPI通信基础 SPI是一种串行通信协议&#xff0c;主要特点包括&#xff1a; 同步通…

2008-2022年 上市公司-环境绩效数据(EP)

环境绩效&#xff08;Environmental Performance&#xff0c;简称EP&#xff09;是衡量组织在环境管理方面成效的重要指标&#xff0c;它体现了组织如何通过有效的环境管理体系来控制环境因素&#xff0c;实现环境方针和目标。以下是对上市公司环境绩效数据的详细介绍&#xff…

图的拓扑排序

图的拓扑排序&#xff08;Topological Sorting&#xff09;是一种线性排序&#xff0c;用于有向无环图&#xff08;Directed Acyclic Graph&#xff0c;DAG&#xff09;。拓扑排序将图中的顶点排成一个线性序列&#xff0c;使得对于每一条有向边 (u, v)&#xff0c;顶点 u 都排…

安全继电器的使用和工作原理

安全继电器的使用和工作原理 安全继电器是一种用于保护人员和设备安全的电气装置&#xff0c;通常用于监控和控制危险或紧急情况下的电气系统。它的主要作用是在检测到故障或危险情况时迅速切断电路&#xff0c;以防止潜在的伤害或损坏。使用 安全继电器通常用于以下情况&…

[AI开发配环境]VSCode远程连接ssh服务器

文章目录 总览&#xff1a;ssh连接远程服务器连接免密登录&#xff1a;Docker&#xff1a;ssh连接远程宿主机后&#xff0c;进一步连接并使用其中的docker容器reload window 配置解释器&#xff1a;CtrlP&#xff0c;在上面输入“>python”, 然后选selecet interpreter运行命…

Ubuntu磁盘分区和挂载 虚拟机扩容 逻辑卷的创建和扩容保姆及教程

目录 1、VMware虚拟机Ubuntu20.04系统磁盘扩容 2、Linux的磁盘分区和挂载 3、创建逻辑卷和逻辑卷的扩容 1、VMware虚拟机Ubuntu20.04系统磁盘扩容 通过下图可以看出我们的根磁盘一共有20G的大小&#xff0c;现在我们把它扩容为30G 注&#xff1a;如果你的虚拟机有快照是无…