当前位置: 首页 > news >正文

Swift入门笔记

Swift入门笔记

  • 简单值
  • 控制流
  • 函数和闭包
  • 对象和类
  • 枚举和结构体
  • 并发
  • 协议和扩展
  • 错误处理
  • 泛型

简单值

// 声明变量
var myVariable = 42
myVariable = 50
// 声明常量
let myConstant = 42
// 声明类型
let implicitInteger = 70
let implicitDouble = 70.0
let explicitDouble: Double = 70
// 显式类型转换
let label = "The width is "
let width = 94
let widthLabel = label + String(width)
// 字符串中转换
let apples = 3
let appleSummary = "I have \(apples) apples"
// 多行内容
let quotation = """Even though there's whitespace to the left,the actual lines aren't indented.Except for this line.Double quotes (") can appear without being wscaped.I still have \(apples) pieces of fruit."""
// 创建数组
var shoppingList = ["catfish", "water", "tulips", "blue paint"]
shoppingList[1] = "bottle of water"
// 创建字典
var occupations = ["Malcolm": "Captain","Kaylee": "Mechanic",
]
occupations["Jayne"] = "Public Relations"
// 数组添加元素
shoppingList.append("blueberries")
// 使用初始化器语法来创建一个空的数组
let emptyArray = [String]()
// 使用初始化器语法来创建一个空的字典
let emptyDictionary = [String: Float]()
// 如果类型信息能被推断(变量设置新的值或者传参数给函数)
shoppingList = []
occupations = [:]

控制流

// 控制流,if语句当中,条件必须是布尔表达式,不再隐式地与零做计算
let individualScores = [75, 43, 103, 87, 12]
var teamScore = 0
for score in individualScores {if score > 50 {teamScore += 3} else {teamScore += 1}
}
// 等于符号赋值或者 return  后使用 if  或者 switch
let scoreDecoration =if teamScore > 10 {"🎉"} else {""}
// ?把某个值标记为可选的
var optionalString: String? = "Hello"
// if-let操作那些可能会丢失的值,
var optionalName: String? = "John Appleseed"
var greeting = "Hello!"
if let name = optionalName {greeting = "Hello, \(name)"
}
// ??提供默认值
let nickName: String? = nil
let fullName: String = "John Appleseed"
let informalGreeting = "Hi \(nickName ?? fullName)"
// Switch 选择语句支持任意类型的数据和各种类型的比较操作,不再限制于整型和测试相等
let vegetable = "red pepper"
switch vegetable {
case "celery":print("Add some raisins and make ants on a log.")
case "cucumber", "watercress":print("That would make a good tea sandwich.")
case let x where x.hasSuffix("pepper"):print("Is it a spicy \(x)?")
default:print("Everything tastes good in soup.")
}
// for-in遍历字典
let interestingNumbers = ["Prime": [2, 3, 5, 7, 11, 13],"Fibonacci": [1, 1, 2, 3, 5, 8],"Square": [1, 4, 9, 16, 25],
]
var largest = 0
for (_, numbers) in interestingNumbers {for number in numbers {if number > largest {largest = number}}
}
// while
var n = 2
while n < 100 {n = n * 2
}
var m = 2
repeat {m = m * 2
} while m < 100
// ..创造序列区间
var total = 0
for i in 0..<4 {total += i
}

函数和闭包

// func声明函数
func greet(person: String, day: String) -> String {return "Hello \(person), today is \(day)"
}
var s = greet(person: "Bob", day: "Tuesday")
// 默认使用形参作为实参,可以在形参前自定义实参名或者使用_避免使用实参
func greet(_ person: String, on day: String) -> String {return "Hello \(person), today is \(day)"
}
s = greet("John", on: "Wednesday")
// 使用元祖来创建复合值
func calculateStatics(scores: [Int]) -> (min: Int, max: Int, sum: Int) {var min = scores[0]var max = scores[0]var sum = 0for score in scores {if score > max {max = score} else if score < min {min = score}sum += score}return (min, max, sum)
}
let statistics = calculateStatics(scores: [5, 3, 100, 3, 9])
print(statistics.sum)
print(statistics.2)
// 函数接受多个参数存放在数组中
func sumOf(numbers: Int...) -> Int {var sum = 0for number in numbers {sum += number}return sum
}
var i = sumOf()
i = sumOf(numbers: 42, 597, 12)
// 内嵌函数可以访问外部函数里的变量
func returnFifteen() -> Int {var y = 10func add() {y += 5}add()return y
}
i = returnFifteen()
// 函数是一等类型,函数可以把函数作为值来返回
func makeIncrementer() -> ((Int) -> Int) {func addOne(number: Int) -> Int {return 1 + number}return addOne
}
var increment = makeIncrementer()
i = increment(7)
// 函数可以做参数
func hasAnyMatches(list: [Int], condition: (Int) -> Bool) -> Bool {for item in list {if condition(item) {return true}}return false
}
func lessThanTen(number: Int) -> Bool {return number < 10
}
var numbers = [20, 19, 7, 12]
var b = hasAnyMatches(list: numbers, condition: lessThanTen)
// 闭包中用in分割实际参数和返回类型
var a = numbers.map({(number: Int) -> Int inlet result = 3 * numberreturn result
})
// 闭包类型已知,可以去掉参数类型和返回类型
let mappedNumbers = numbers.map({ number in 3 * number})
print(mappedNumbers)
// 通过数字调用参数,当闭包时最后一个参数时,可以直接跟在圆括号后边。如果闭包是唯一参数,可以去掉圆括号。
let sortedNumbers = numbers.sorted { $0 > $1 }

对象和类

// 创建类
class Shape {var numberOfSides = 0func simpleDescription() -> String {return "A shape with \(numberOfSides) sides."}
}
// 创建实例,访问实例的属性和方法
var shape = Shape()
shape.numberOfSides = 7
var shapeDescription = shape.simpleDescription()
// 初始化器
class NameShape {var numberOfSides: Int = 0var name: Stringinit(name: String) {self.name = name}func simpleDescription() -> String {return "A shape with \(numberOfSides) sides."}
}
// 子类重写父类的实现
class Square: NameShape {var sideLength: Doubleinit(sideLength: Double, name: String){self.sideLength = sideLengthsuper.init(name: name)numberOfSides = 4}func area() -> Double {return sideLength * sideLength}override func simpleDescription() -> String {return "A square with sides of length \(sideLength)."}
}
let test = Square(sideLength: 5.2, name: "my test square")
var d = test.area()
s = test.simpleDescription()
// 计算属性
class EquilateralTriangle: NameShape {var sideLength: Double = 0.0init(sideLength: Double, name: String){self.sideLength = sideLengthsuper.init(name: name)numberOfSides = 3}var perimeter: Double {get {return 3.0 * sideLength}set {sideLength = newValue / 3.0}}override func simpleDescription() -> String {return "An equilateral triangle with sides of length \(sideLength)."}
}
// 在设置一个新值前后执行代码
class TriangleAndSquare {var triangle: EquilateralTriangle {willSet {square.sideLength = newValue.sideLength}}var square: Square {willSet {triangle.sideLength = newValue.sideLength}}init(size: Double, name: String) {square = Square(sideLength: size, name: name)triangle = EquilateralTriangle(sideLength: size, name: name)}
}
// 如果?前面的值是nil,那?后的所有内容都会被忽略并且整个表达式的值都是nil。否则,可选项的值将被展开,然后?后边的代码根据展开的值执行
let optionalSquare: Square? = Square(sideLength: 2.5, name:"optional square")
let sideLength = optionalSquare?.sideLength

枚举和结构体

// 枚举,默认从零开始给原始值赋值后边递增,可以通过制定特定的值来改变
enum Rank: Int {case ace = 1case two, three, four, five, six, seven, eight, nine, tencase jack, queen, kingfunc simpleDescription() -> String {switch self {case .ace:return "ace"case .jack:return "jack"case .queen:return "queen"case .king:return "king"default:return String(self.rawValue)}}
}
let ace = Rank.ace
let aceRawValue = ace.rawValue
// 使用init?(rawValue)初始化器从原始值创建枚举实例
if let convertedRank = Rank(rawValue: 3) {let threeDescription = convertedRank.simpleDescription()print(threeDescription)
}
// 枚举成员的值是实际的值
enum Suit {case spades, hearts, diamonds, clubsfunc simpleDescription() -> String {switch self {case .spades:return "spades"case .hearts:return "hearts"case .diamonds:return "diamonds"case .clubs:return "clubs"}}
}
let hearts = Suit.hearts
let heartsDescription = hearts.simpleDescription()
// case与值关联,值在初始化实例的时候确定,这样它们就可以在每个实例中不同了
enum ServerResponse {case result(String, String)case failure(String)
}
let success = ServerResponse.result("6:00 am", "8:09 pm")
let failure = ServerResponse.failure("Out of cheese.")
switch success {case let .result(sunrise, sunset):print("Sunrise is at \(sunrise) and sunset is at \(sunset)")case let .failure(message):print("Failure... \(message)")
}
// 结构体在传递的时候拷贝其自身,而类会传递引用
struct Card {var rank: Rankvar suit: Suitfunc simpleDescription() -> String {return "The \(rank.simpleDescription()) of \(suit.simpleDescription())"}
}
let threeOfSpades = Card(rank: .three, suit: .spades)
let threeOfSpadesDescription = threeOfSpades.simpleDescription()

并发

// async标记异步执行的函数
func fetchUserID(from server: String) async -> Int {if server == "primary"{return 97}return 501
}
// await标记对异步函数的调用
func fetchUsername(from server: String) async -> String {let userID = await fetchUserID(from: server)if userID == 501 {return "John Appleseed"}return "Guest"
}
// async let可让它与其他异步函数并行执行,当要用返回值时,再使用await
func connectUser(to server: String) async {async let userID = fetchUserID(from: server)async let username = fetchUsername(from: server)let greeting = await "Hello \(username), user ID \(userID)"print(greeting)
}
// 在同步代码中调用异步函数,不用等它返回
Task {await connectUser(to: "primary")
}
// 使用任务组来构造并发代码
let userIDs = await withTaskGroup(of: Int.self) { group infor server in ["primary", "secondary", "development"] {group.addTask {return await fetchUserID(from: server)}}var results: [Int] = []for await result in group {results.append(result)}return results
}
print(userIDs)
// 执行者确保不同异步函数可以在同一时间安全地与同一个执行者的实例进行交互
actor ServerConnection {var server: String = "primary"private var activeUsers: [Int] = []func connect() async -> Int {let userID = await fetchUserID(from: server)activeUsers.append(userID)return userID}
}
// 调用执行者的方法或属性时,要用await标记代码以表明它可能需要等待其他正在访问的代码结束
let server = ServerConnection()
let userID = await server.connect()

协议和扩展

// protocol声明协议
protocol ExampleProtocol {var simpleDescription: String { get }mutating func adjust()
}
// 类、枚举以及结构体都兼容协议,mutating关键字来声明使方法可以修改结构体,类中不需要这样声明
class SimpleClass: ExampleProtocol {var simpleDescription: String = "A very simple class."var anothorProperty: Int = 69105func adjust() {simpleDescription += " Now 100% adjusted."}
}
var aa = SimpleClass()
aa.adjust()
let aDescription = aa.simpleDescriptionstruct SimpleStructure: ExampleProtocol {var simpleDescription: String = "A simple structure"mutating func adjust() {simpleDescription += " (adjusted)"}
}
var bb = SimpleStructure()
bb.adjust()
let bDescription = bb.simpleDescription
// 使用extension来给现存的类型增加功能
extension Int: ExampleProtocol {var simpleDescription: String {return "The number \(self)"}mutating func adjust() {self += 42}
}
print(7.simpleDescription)
// 当操作类型是协议类型的值的时候,协议外定义的方法是不可用的
let protocolValue: ExampleProtocol = aa
print(protocolValue.simpleDescription)
// print(protocolValue.anothorProperty)

错误处理

// 用任何遵循Error协议的类型来表示错误
enum PrinterError: Error {case outOfPapercase noTonercase onFire
}
// 使用throw来抛出错误并且用throws标记一个可以抛出错误的函数。如果在函数里抛出一个错误,函数会立即返回并且调用函数的代码处理错误
func send(job: Int, toPrinter printerName: String) throws -> String {if printerName == "Never Has Toner" {throw PrinterError.noToner}return "Job sent"
}
// 用do-catch处理错误。在do代码里,用try来在能抛出错误的函数前标记。在catch代码块,如果不给定其他名字,错误会自动赋予名字error。
do {let printResponse = try send(job: 1040, toPrinter: "Bi Sheng")print(printResponse)
} catch {print(error)
}
// 提供多个catch代码块来处理特定的错误,用法和switch里的case一样
do {let printResponse = try send(job: 1440, toPrinter:"Gutenberg")print(printResponse)
} catch PrinterError.onFire {print("I'll just put this over here, with the rest of the fire")
} catch let printerError as PrinterError {print("Printer error: \(printerError).")
} catch {print(error)
}
// 使用try?来转换结果为可选项。如果函数抛出了错误,那么错误被忽略并且结果为nil。否则,结果是一个包含了函数返回值的可选项
let printerSuccess = try? send(job: 1884, toPrinter: "Mergenthaler")
let printerFailure = try? send(job: 1885, toPrinter: "Never Has Toner")
// 使用defer来写函数返回后也会被执行的代码,无论是否错误被抛出。甚至可以在没有任何错误处理的时候使用defer,来简化需要在多处地方返回的函数。
var fridgeIsOpen = false
let fridgeContent = ["milk", "eggs", "leftovers"]
func fridgeContains(_ food: String) -> Bool {fridgeIsOpen = truedefer {fridgeIsOpen = false}print(fridgeIsOpen)let result = fridgeContent.contains(food)return result
}
b = fridgeContains("banana")
print(fridgeIsOpen)

泛型

// 创建一个泛型方法或者类型
func makeArray<Item>(repeating item: Item, numberOfTimes: Int) -> [Item] {var result = [Item]()for _ in 0..<numberOfTimes {result.append(item)}return result
}
var aes = makeArray(repeating: "knock", numberOfTimes:4)
print(aes)
// 可以从函数、方法、类、枚举、结构体创建泛型
enum OptionalValue<Wrapped> {case nonecase some(Wrapped)
}
var possibleInteger: OptionalValue<Int> = .none
possibleInteger = .some(100)
// 类型名称后紧接where来明确一系列需求
func anyCommonElements<T: Sequence, U: Sequence>(_ lhs: T, _ rhs: U) -> Boolwhere T.Iterator.Element: Equatable, T.Iterator.Element == U.Iterator.Element {for lhsItem in lhs {for rhsItem in rhs {if lhsItem == rhsItem {return true}}}return false}b = anyCommonElements([1, 2, 3], [3])print(b)

相关文章:

Swift入门笔记

Swift入门笔记 简单值控制流函数和闭包对象和类枚举和结构体并发协议和扩展错误处理泛型 简单值 // 声明变量 var myVariable 42 myVariable 50// 声明常量 let myConstant 42// 声明类型 let implicitInteger 70 let implicitDouble 70.0 let explicitDouble: Double 7…...

【提交ACM出版 | EIScopus检索稳定 | 高录用】第五届大数据与社会科学国际学术会议(ICBDSS 2024,8月16-18)

第五届大数据与社会科学国际学术会议&#xff08;ICBDSS 2024&#xff09;将于2024年08月16-18日在中国-上海隆重举行。 ICBDSS会议在各专家教授的支持下&#xff0c;去年已成功举办了四届会议。为了让更多的学者有机会参与会议分享交流经验。本次会议主要围绕“大数据”、“社…...

Postman与世界相连:集成第三方服务的全面指南

&#x1f50c; Postman与世界相连&#xff1a;集成第三方服务的全面指南 Postman不仅是API开发和测试的强大工具&#xff0c;还支持与多种第三方服务的集成&#xff0c;从而扩展其功能&#xff0c;提高开发和测试的效率。本文将深入探讨如何在Postman中集成第三方服务&#xf…...

Perl 语言开发(十四):数据库操作

目录 1. 数据库连接 2. 基本数据库操作 2.1 插入数据 2.2 查询数据 2.3 更新数据 2.4 删除数据 3. 高级查询 3.1 多表连接 3.2 子查询 3.3 聚合查询 4. 事务处理 5. 数据库连接池 6. 常见的数据库模块 7. 综合实例 结论 数据库操作是大多数软件系统的核心部分。…...

Qt+ESP32+SQLite 智能大棚

环境简介 硬件环境 ESP32、光照传感器、温湿度传感器、继电器、蜂鸣器 基本工作流程 上位机先运行&#xff0c;下位机启动后尝试连接上位机连接成功后定时上报传感器数据到上位机&#xff0c;上位机将信息进行处理展示判断下位机传感器数据&#xff0c;如果超过设置的阈值&a…...

Android Viewpager2 remove fragmen不生效解决方案

一、介绍 在如今的开发过程只&#xff0c;内容变化已多单一的fragment&#xff0c;变成连续的&#xff0c;特别是以短视频或者直播为主的场景很多。从早起的Viewpage只能横向滑动&#xff0c;到如今的viewpage2可以支持横向或者竖向滑动。由于viewpage2的adapter在设计时支持缓…...

桃园南路上的红绿灯c++

题目描述 XXX非常讨厌等红绿灯&#xff0c;于是他仔细观察了桃园南路与科技路交叉口的一个红绿灯的周期。 从七点半开始&#xff0c;这个红绿灯的每个周期会按照下面四个阶段变化&#xff1a; 先保持 x 分钟的红灯然后保持 y 分钟的黄灯然后保持 z 分钟的绿灯最后保持 y 分钟…...

有关去中心化算路大模型的一些误区:低带宽互连导致训练速度太慢;小容量设备无法生成基础规模的模型;去中心化总是会花费更多;虫群永远不够大

目录 有关去中心化算路大模型的一些误区 低带宽互连导致训练速度太慢 挑战与解决方案 展望 小容量设备无法生成基础规模的模型 1. 模型规模与设备内存 2. 解决方案 3. 效率挑战 FSDP(Fully Sharded Data Parallel) Zero-3 去中心化总是会花费更多 虫群永远不够大…...

uni-app iOS上架相关App store App store connect 云打包有次数限制

app store上架成功&#xff0c;亲测在苹果开发者通过审核后在数小时内app store是不会更新的&#xff0c;昨天4点多通过审核&#xff0c;在下班六点半时app store仍未更新&#xff0c;早上来看更新了。 相册权限 uni-app云打包免费有次数 切换一个账号继续...

python单测框架之pytest常见用法

单测框架的作用 测试发现&#xff1a;从多个文件中寻找测试用例。测试执行&#xff1a;按照一定顺序去执行并且生成结果。测试断言&#xff1a;判断最终结果与实际结果的差异。测试报告&#xff1a;统计测试进度、耗时、通过率&#xff0c;生成测试报告。 pytest简介 pytest是…...

[终端安全]-8 隐私保护和隐私计算技术

1 隐私保护相关法规和标准 1&#xff09;国内法规和标准 1.1&#xff09;中华人民共和国网络安全法&#xff08;2017年&#xff09; - 规定了个人信息的保护和数据安全的基本原则。 - 要求网络运营者采取措施防止数据泄露、篡改和丢失。 1.2&#xff09;信息安全技术&#x…...

MySQL 日志深度解析:从查询执行到性能优化

引言 MySQL 日志是数据库管理员和开发者的宝贵资源&#xff0c;它提供了查询执行的详细情况&#xff0c;帮助我们诊断问题和优化性能。本文将深入分析一个具体的 MySQL 日志条目&#xff0c;解释其含义&#xff0c;并提供针对性的优化建议。 日志信息概览 让我们先来快速了解…...

sql server 练习题5

课后作业 在homework库下执行 作业1&#xff1a; 案例&#xff1a;根据用户分数划分等级。小于60分为不及格&#xff0c;[60,80)为及格&#xff0c;[80,90)为良好&#xff0c;大于等于90分以上为优秀。 建表语句&#xff1a; CREATE TABLE Grades ( ID INT PRIMARY KEY, Name V…...

ai伪原创生成器app,一键伪原创文章效率高

如今&#xff0c;在自媒体创作的领域&#xff0c;ai伪原创生成器app的出现&#xff0c;给写作带来了一种全新的方式和效率。ai伪原创生成器app通过使用先进的自然语言处理技术和深度学习算法&#xff0c;能够将原始文章进行重组和改写&#xff0c;生成新的文章&#xff0c;从而…...

【ZhangQian AI模型部署】目标检测、SAM、3D目标检测、旋转目标检测、人脸检测、检测分割、关键点、分割、深度估计、车牌识别、车道线识别

在模型部署落地&#xff08;主要部署到rk3588&#xff09;折腾了这么多年&#xff0c;把这些年折腾过的模型整理了一下&#xff0c;所有的流程说明、代码模型都完全开放的&#xff0c;欢迎交流学习。有的是为了项目、有的是为了学习、还有的是为了找点事做、有的完全是为了安抚…...

DROO论文笔记

推荐文章DROO源码及论文学习 读论文《Deep Reinforcement Learning for Online Computation Offloading in Wireless Powered Mobile-Edge Computing Networks》的笔记 论文地址&#xff1a;用于无线移动边缘计算网络在线计算卸载的深度强化学习 论文代码地址&#xff1a;DR…...

修BUG:程序包javax.servlet.http不存在

貌似昨晚上并没有成功在tomcat上面运行&#xff0c;而是直接运行了网页。 不知道为啥又报错这个。。。 解决方案&#xff1a; https://developer.baidu.com/article/details/2768022 就整了这一步就行了 而且我本地就有这个tomcat就是加进去了。 所以说啊&#xff0c;是不是&a…...

python常用库

目录 from sklearn import metrics:评估 ​编辑 svm&#xff1a; ​编辑 逻辑回归预测 ​编辑 朴素贝叶斯分类 ​编辑 主成分分析 ​编辑 其实就是求b.T的协方差阵 ​编辑 【因子分析&#xff0c;因子旋转有点复杂&#xff0c;略】 【层次聚类&#xff0c;原理…...

【UE5.3】笔记11

一、变量的SET&&GET 1、创建变量保存数据&#xff0c;如下图&#xff0c;找到左侧我的蓝图下的变量&#xff0c;新增一个&#xff0c;并选择类型。使用的时候直接将变量拖到蓝图中&#xff0c;此时会显示两个选项一个是获取一个是设置。 选择获取就是个GET蓝图&#x…...

加密与安全 密钥体系的三个核心目标之完整性解决方案

在密钥体系中&#xff0c;确保数据完整性是重要目标之一。以下为您详细讲解相关的完整性解决方案&#xff1a; 消息认证码&#xff08;MAC&#xff09;&#xff1a; 消息认证码是基于共享密钥和特定算法生成的固定长度代码。在发送方&#xff0c;将消息和共享密钥作为输入&…...

FastAPI 学习之路(四十一)定制返回Response

接口中返回xml格式内容 from fastapi import FastAPI, Responseapp FastAPI()# ① xml app.get("/legacy") def get_legacy_data():data """<?xml version"1.0"?><shampoo><Header>Apply shampoo here.</Header&…...

C++ //练习 15.9 在什么情况下表达式的静态类型可能与动态类型不同?请给出三个静态类型与动态类型不同的例子。

C Primer&#xff08;第5版&#xff09; 练习 15.9 练习 15.9 在什么情况下表达式的静态类型可能与动态类型不同&#xff1f;请给出三个静态类型与动态类型不同的例子。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 解释 当print_t…...

斐波那契查找算法

斐波那契查找原理&#xff0c;仅仅改变了中间结点(mid)的位置&#xff0c;mid不再是中间或插值得到,而是位于黄金分割点附近&#xff0c;即midlowF(k-1)-1(F代表斐波那契数列) F[k]F[k-1]F[k-2],>(F[k]-1) (F[k-1]-1)(F[k-2]-1)1 说明:只要顺序表的长度为F[k]-1,则可以将该…...

CAN总线学习

can主要用于汽车、航空等控制行业&#xff0c;是一种串行异步通信方式&#xff0c;因为其相较于其他通信方式抗干扰能力更强&#xff0c;更加稳定。原因在于CAN不像其他通信方式那样&#xff0c;以高电平代表1&#xff0c;以低电平代表0&#xff0c;而是通过电压差来表示逻辑10…...

zookeeper基础知识学习

官网&#xff1a;Apache ZooKeeper 下载地址&#xff1a;Index of /dist/zookeeper/zookeeper-3.5.7Index of /dist/zookeeperIndex of /dist/zookeeper/zookeeper-3.5.7 ZK配置参数说明&#xff1a; 1、tickTime2000&#xff1a;通讯心跳时间&#xff0c;zookeeper服务器与客…...

C语言内存管理深度解析面试题及参考答案(2万字长文)

在嵌入式面试时,C语言内存管理是必问面试题,也是难点,相关知识点可以参考: C语言内存管理深度解析​​​​​​​ 下面整理了各种类型的C语言内存管理的面试题: 目录 全局变量和局部变量在内存中分别存储在哪个区域? 静态变量和全局变量有什么区别? 什么是作用域?…...

C++基础(二)

目录 1.类和对象 1.1类的定义 1.2访问限定符 1.3类域 2.实例化 2.1实例化概念 2.2对象大小 3.this指针 4.类的默认成员函数 4.1构造函数 4.2析构函数 4.5运算符重载 1.类和对象 1.1类的定义 类的定义格式 class为定义类的关键字&#xff0c;Stack为类的名字&…...

R 绘图 - 中文支持

R 绘图 - 中文支持 R 是一种广泛使用的统计和数据分析编程语言&#xff0c;它提供了强大的绘图功能。然而&#xff0c;R 的默认设置并不直接支持中文&#xff0c;这可能会在使用 R 进行绘图时造成困扰&#xff0c;尤其是当需要在图表中添加中文标签或标题时。本文将介绍如何在…...

使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击-标题菜单及游戏结束界面(九)

文章目录 开发思路标题菜单界面标题菜单脚本代码结束菜单界面结束菜单脚本代码 使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击&#xff08;一&#xff09; 使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击-激光组件&#xff08;二&#xff09; 使用Godot4组件制作竖版…...

[终端安全]-6 移动终端之应用程序安全

笔者在终端安全专题前面的文章中介绍了移动终端硬件安全和操作系统安全&#xff0c;本文主要介绍移动终端应用安全。在本文最前面&#xff0c;笔者想先解答一位朋友的疑问&#xff0c;为什么需要费心打造一个完整的面面俱到的安全体系&#xff1f; 1 移动终端安全的重要性 移…...