#Swift 对比 Static 在Swift 和 OC中的用法
在 Objective-C 和 Swift 中,static
关键字都用于定义类型级别的成员,但它们的用法和行为在两个语言中有所不同。让我们来详细对比一下 Objective-C 和 Swift 中 static
的使用方式和特性。
1. Objective-C 中的 static
在 Objective-C 中,static
关键字有几种不同的用途:
a. 静态变量(Static Variables)
在 Objective-C 中,static
可以用于声明在某个文件或函数内作用域的静态变量。静态变量只会被初始化一次,其值在整个程序的生命周期内保持不变。常见的用法是在函数内部声明一个静态变量,使其在多次调用时保持值。
void incrementCounter() {static int counter = 0; // 静态变量counter++;NSLog(@"Counter: %d", counter);
}incrementCounter(); // 输出:Counter: 1
incrementCounter(); // 输出:Counter: 2
在上面的代码中,counter
是一个静态变量,它在 incrementCounter
函数的多次调用中保持累加效果。
b. 静态全局变量(File Scope)
在文件级别使用 static
声明的变量或函数只能在当前文件中访问,无法被其他文件访问。它用于限制变量和函数的作用域,防止命名冲突。
static NSString *globalString = @"Hello, World!";
在这里,globalString
只能在定义它的文件中访问,其他文件无法直接引用。
c. 类级别常量
Objective-C 中没有 static
属性的概念。为了定义类级别的常量,通常使用类方法来提供访问,例如:
@interface MyClass : NSObject
+ (NSString *)classLevelConstant;
@end@implementation MyClass
+ (NSString *)classLevelConstant {return @"Class Level Constant";
}
@end
2. Swift 中的 static
在 Swift 中,static
用于声明类、结构体和枚举的类型属性和类型方法。它使得属性或方法与类型本身关联,而不是与类型的具体实例关联。
a. 类型属性 type property(Static Properties)
在 Swift 中,static
用于定义与类型本身关联的属性,可以在类、结构体和枚举中使用。与 Objective-C 不同的是,Swift 允许在结构体和枚举中使用 static
定义类型属性和类型方法。
struct MathConstants {static let pi = 3.14159
}print(MathConstants.pi) // 输出: 3.14159
在这个示例中,pi
是一个类型属性,属于 MathConstants
类型,而不是某个具体的实例。
b. 类型方法(Static Methods)
Swift 中的 static
还用于声明类型方法,可以直接通过类型名调用。结构体和枚举中的静态方法使用 static
声明,类中的静态方法也可以使用 class
关键字,这样子类可以重写该方法。
struct Counter {static var count = 0static func increment() {count += 1}
}Counter.increment()
print(Counter.count) // 输出: 1
3. static
与多态性和重写的区别
在 Swift 中,static
方法和属性不能被重写,也不支持多态。它们始终与声明它们的类型绑定。在类中,Swift 提供了 class
关键字,使得类型方法可以在子类中被重写。
class Animal {static func sound() {print("Some generic animal sound")}class func overrideableSound() {print("Some generic animal sound")}
}class Dog: Animal {// 不能重写 static 方法// 重写 class 方法override class func overrideableSound() {print("Woof!")}
}Animal.sound() // 输出: Some generic animal sound
Dog.sound() // 输出: Some generic animal soundAnimal.overrideableSound() // 输出: Some generic animal sound
Dog.overrideableSound() // 输出: Woof!
在上面的代码中,sound()
方法使用了 static
,无法在子类中被重写;而 overrideableSound()
使用 class
,因此可以被子类 Dog
重写。
Objective-C 和 Swift 中 static
的对比
特性 | Objective-C | Swift |
---|---|---|
静态变量作用域 | 可以用于限制变量的文件作用域 | 没有文件级别的 static ,但可以用全局变量 |
静态变量和方法 | 用于函数中的静态变量和限制文件作用域的变量 | 可用于类、结构体和枚举的类型属性和方法 |
类型属性支持 | 没有内建类型属性;通常用类方法实现 | 支持 static 和 class 类型属性 |
重写和多态性 | 无法重写静态类方法 | static 方法不能重写,class 可以被重写 |
用法场景 | 函数内部持久性变量、文件级别的常量和函数 | 类型级别的常量、属性,和不可重写的类型方法 |
总结
- Objective-C 中的
static
:用于创建函数内持久变量、文件级别变量和静态类常量,但无法用于类型属性和类型方法。 - Swift 中的
static
:可以用于类、结构体和枚举的类型属性和方法,属于类型而非实例,且不可重写。Swift 还提供了class
,用于定义可被子类重写的类型方法,使其适合多态性的使用。
在 Swift 中的 static
用法更为广泛和灵活,适用于多种类型,并且可以更直接地支持类型级别的成员。
相关文章:
#Swift 对比 Static 在Swift 和 OC中的用法
在 Objective-C 和 Swift 中,static 关键字都用于定义类型级别的成员,但它们的用法和行为在两个语言中有所不同。让我们来详细对比一下 Objective-C 和 Swift 中 static 的使用方式和特性。 1. Objective-C 中的 static 在 Objective-C 中,…...

yakit使用教程(三,端口探测和指纹扫描)
本文仅作为学习参考使用,本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 前言: 前文链接:yakit下载安装教程。 1.端口扫描的作用。 对目标端口进行扫描可以知道目标服务器开启了什么服务,以便于针对其所存在的服务展开…...

一维数组的引用
#define SIZE 5 int main(void) { int i 0; int arr[SIZE] { 86,85,85,896,45 };//同理五个数据只是偶然,可能会更多 //输入 for (i 0;i < SIZE;i) { printf("请输入你的第%d个值:",i1); scanf_s(&…...
Vue3 watch 监视属性
作用:监视数据的变化(和Vue2中的watch作用一致)特点:Vue3中的watch只能监视以下四种数据: ref定义的数据。reactive定义的数据。函数返回一个值(getter函数)。一个包含上述内容的数组。 我们在V…...

大数据-158 Apache Kylin 安装配置详解 集群模式启动
点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…...

PHP商会招商项目系统一站式服务助力企业腾飞
商会招商项目系统——一站式服务,助力企业腾飞 🚀💼 🚀 开篇:企业成长的加速器,商会招商项目系统来袭 在竞争激烈的市场环境中,企业如何快速找到适合自己的发展路径,实现腾飞&…...
pnpm 和 npm
pnpm 和 npm 是 JavaScript 生态系统中常用的包管理工具,它们各自有不同的特性和优缺点。下面是这两者的详细比较: 1. 基本概念 npm (Node Package Manager): 是 Node.js 的默认包管理器,提供安装、更新、卸载 JavaScript 包的功…...

笔试算法总结
文章目录 题目1题目2题目3题目4 题目1 使用 StringBuilder 模拟栈的行为,通过判断相邻2个字符是否相同,如果相同就进行删除 public class Main {public static String fun(String s) {if (s null || s.length() < 1) return s;StringBuilder builde…...

mybatisPlus对于pgSQL中UUID和UUID[]类型的交互
在PGSQL中,有的类型是UUID和UUID[]这种类型,在mybatis和这些类型交互的时候需要手动设置类型处理器才可以,这里记录一下类型处理器的设置 /*** UUID类型处理器*/ public class UUIDTypeHandler extends BaseTypeHandler<UUID> {/*** 获…...

vue3 高德地图标注(飞线,呼吸点)效果
装下这两个 npm 忘了具体命令了,百度一下就行 “loca”: “^1.0.1”, “amap/amap-jsapi-loader”: “^1.0.1”, <template><div id"map" style"width: 100%;height: 100%;"></div> </template><script setup> …...

程序员成长秘籍:是迈向管理巅峰,还是深耕技术架构?
专业在线打字练习平台-巧手打字通,只输出有价值的知识。 一 管理和架构 做技术的同学一般有两条职业发展路径,横向的管理路线和纵向的技术路线。管理路线对应的是管理岗,讲究的是排兵布阵,通过各种资源的优化配置发挥价值。技术路…...
xargs的参数及常用命令
1. xargs 命令简介 xargs 是一个非常有用的工具,它用于从标准输入(stdin)构建和执行命令行。xargs 可以将标准输入中以空格或换行符分隔的数据,转化为命令的参数传递给其他命令。 使用场景: 当某些命令不支持使用管…...
FLASK 数据库建立以及部署和表的创建
首先安装flask-sqlalchemy db SQLAlchemy(app) 一 Mmeber、User模型类的创建 # coding: utf-8 from app import db, appclass Member(db.Model):__tablename__ memberid db.Column(db.Integer, primary_keyTrue)membername db.Column(db.String(100), uniqueTrue, index…...
微信小程序的面试题
简述下 wx.navigateTo(), wx.redirectTo(), wx.switchTab(), wx.navigateBack(), wx.reLaunch() 区别 ? wx.navigateTo() : 保留当前页面,跳转到应用内的某个页面。但是不能跳到 tabbar 页面 wx.redirectTo() : 关闭当前页面,跳转到应用内的…...
udp c语言实现组播的例子
一、组播与广播的区别 1、组播地址和广播地址是不同的概念 组播地址:用于将数据包发送到一组特定的接收者,只有加入该组播地址的设备才能接收数据。它提高了网络效率,因为发送者只需发送一份数据。 广播地址:用于将数据包发送到…...
ffmpeg面向对象——AVInputFormat与URLProtocol啥关系
《ffmpeg面向对象-rtsp拉流相关对象》和《ffmpeg面向对象——拉流协议匹配机制探索》探索过了输入格式匹配和底层协议匹配,且ffmpeg拉流是先是匹配输入格式——抽象为AVInputFormat类,然后再匹配url协议类——抽象为URLProtocol类。 它们是啥关系&#…...

【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解
高阶数据结构相关知识点可以通过点击以下链接进行学习一起加油!二叉搜索树 大家好,这里是店小二!今天我们将深入探讨高阶数据结构中的AVL树。AVL树是一种自平衡的二叉搜索树,可以看作是对传统二叉搜索树的优化版本。如果你对数据结…...

中级软考软件设计师真题+模拟题+课件讲解+机考讲解模拟+笔记分享
软考真题分享 下载链接⬇️⬇️: 下载链接...

MySQL—视图
前言: 视图是一个虚拟的表,是基于一个或多个基本表或其他视图的查询结果集。视图本身不占据物理储存空间,仅仅只是一个查询的逻辑表示,物理上依赖于数据表的数据。 视图具有简单,安全,逻辑数据独立&#…...

鸿蒙OS启动流程
启动流程(基于openharmony4.1) 系统上电加载内核后,按照以下流程完成系统各个服务和应用的启动: 内核加载init进程,一般在bootloader启动内核时通过设置内核的cmdline来指定init的位置。init进程启动后,会挂载tmpfs,…...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...

多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...

selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...