ios客户端学习笔记(五):学习Swift的关键字和容易弄混的符号

news2024/12/29 9:25:57

1. 关键字

下面是Swift语言中的常见关键字及其说明和代码应用实例:

  1. class:定义一个类,用于封装一组相关的属性和方法。

示例代码:

class Person {
    var name: String = ""
    var age: Int = 0
}
  1. struct:定义一个结构体,用于封装一组相关的值类型数据。

示例代码:

struct Point {
    var x: Int
    var y: Int
}
  1. enum:定义一个枚举类型,用于封装一组相关的有限值。

示例代码:

enum Direction {
    case north
    case south
    case east
    case west
}
  1. extension:扩展一个已有的类型,添加新的属性、方法或下标等。

示例代码:

extension String {
    func reverse() -> String {
        var result = ""
        for char in self {
            result = String(char) + result
        }
        return result
    }
}

let str = "hello"
let reversedStr = str.reverse() // "olleh"
  1. protocol:定义一个协议,用于规定一组方法、属性或其他需求,可以被类、结构体或枚举类型实现。

示例代码:

protocol Printable {
    var description: String { get }
}

struct Person: Printable {
    var name: String
    var age: Int
    
    var description: String {
        return "\(name), \(age) years old"
    }
}

let person = Person(name: "Tom", age: 20)
print(person) // "Tom, 20 years old"
  1. guard:用于提前退出函数、方法或循环,以避免出现嵌套的 if 语句。

示例代码:

func test(age: Int?) {
    guard let age = age, age >= 18 else {
        print("未满18岁")
        return
    }
    print("已满18岁")
}

test(age: 20) // "已满18岁"
test(age: nil) // "未满18岁"
test(age: 16) // "未满18岁"
  1. weak:用于声明一个弱引用,避免循环引用问题。

示例代码:

class Person {
    var name: String = ""
    weak var spouse: Person?
}

var tom: Person? = Person()
var lily: Person? = Person()

tom?.name = "Tom"
lily?.name = "Lily"

tom?.spouse = lily
lily?.spouse = tom

tom = nil
print(lily?.spouse?.name) // nil
  1. static:用于定义一个静态属性或方法,可以通过类型名直接调用。

示例代码:

struct Math {
    static let pi = 3.14
    
    static func square(_ x: Int) -> Int {
        return x * x
    }
}

print(Math.pi) // 3.14
print(Math.square(2)) // 4
  1. private:用于限制访问级别,只有在当前文件内可以访问。
    public、internal、fileprivate、private
    在这里插入图片描述

示例代码:

class Person {
    private var name: String = ""
    var age: Int = 0
    
    func printName() {
        print(name)
    }
}

let person = Person()
person.age = 20
person.printName() // 编译错误,name为私有属性
  1. override:用于重写父类的方法、属性或下标等。

示例代码:

class Animal {
    var name: String = ""
    
    func makeSound() {
        print("...")
    }
}

class Dog: Animal {
    override func makeSound() {
        print("wangwang")
    }
}

let dog = Dog()
dog.makeSound() // "wangwang"
  1. final:Swift中,final关键字可以在class、func和var前修饰。表示 不可重写,可以将类或者类中的部分实现保护起来,从而避免子类破坏。
class Fruit {
    //修饰词 final 表示 不可重写 可以将类或者类中的部分实现保护起来,从而避免子类破坏
    final  func price(){
        print("price")
    }
}

class Apple : Fruit {//类继承
    //重写父类方法
    override func price() {
        print("重写父类的price 方法")
    }
    // 上面的会报错
}
  1. mutating:写在func前面,以便于让func可以修改struct和protocol的extension中的成员的值。 如果func前面不加mutating,struct和protocol的extension中的成员的值便被保护起来,不能修改

另外可看Swift中常用关键字

2. 容易弄混的符号(? !)

Swift 可选(Optionals)类型
Swift 的可选(Optional)类型,用于处理值缺失的情况。可选表示"那儿有一个值,并且它等于 x “或者"那儿没有值”。

Swfit语言定义后缀?作为命名类型Optional的简写,换句话说,以下两种声明是相等的:

var optionalInteger: Int?
var optionalInteger: Optional<Int>

在这两种情况下,变量 optionalInteger 都是可选整数类型。注意,在类型和 ?之间没有空格。

Optional 是一个含有两种情况的枚举,None 和 Some(T),用来表示可能有或可能没有值。任何类型都可以明确声明为(或者隐式转换)可选类型。当声明一个可选类型的时候,要确保用括号给 ? 操作符一个合适的范围。例如,声明可选整数数组,应该写成 (Int[])? 写成 Int[]? 会报错。

当你声明一个可选变量或者可选属性的时候没有提供初始值,它的值会默认为 nil。

可选项遵照 LogicValue 协议,因此可以出现在布尔环境中。在这种情况下,如果可选类型T?包含类型为T的任何值(也就是说它的值是 Optional.Some(T) ),这个可选类型等于 true,反之为 false。

如果一个可选类型的实例包含一个值,你可以用后缀操作符 !来访问这个值,如下所示:

optionalInteger = 42
optionalInteger! // 42
使用操作符!去获取值为nil的可选变量会有运行时错误。

你可以用可选链接和可选绑定选择性执行可选表达式上的操作。如果值为nil,任何操作都不会执行,也不会有运行报错。

来源:菜鸟教程

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

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

相关文章

网络安全与攻防-常见网络安全攻防

目录 攻击手段&防御策略 阻断服务攻击&#xff08;DoS&#xff09; 地址解析欺骗&#xff08;ARP攻击&#xff09;&#xff08;Address Resolution Protocol spoofing&#xff09; 跨站脚本攻击&#xff08;XSS&#xff09; SQL注入 跨站请求伪造&#xff08;csrf&am…

AlgoC++第二课:线性回归

目录 线性回归前言1. 定义2. 房价预测案例2.1 定义问题&#xff1a;2.2 MSE是如何被定义的&#xff1f;(如何推导的&#xff1f;)2.3 总结 3. 代码3.1 C实现3.1.1 数据读取和处理3.1.2 线性回归模型3.1.3 参数输出和预测3.1.4 完整示例代码3.1.5 C知识点 3.2 python实现3.2.1 房…

【移动端网页布局】移动端网页布局基础概念 ① ( 移动端浏览器 | 移动端屏幕分辨率 | 移动端网页调试方法 )

文章目录 一、移动端浏览器二、移动端屏幕分辨率三、移动端网页调试方法 一、移动端浏览器 移动端浏览器 比 PC 端浏览器发展要晚 , 使用的技术比较新 , 对 HTML5 CSS3 支持较好 , 常见的浏览器如下 : UC / QQ / Opera / Chrom / 360 / 百度 / 搜狗 / 猎豹 国内的浏览器 基本…

算法套路十一 ——回溯法之组合型回溯

算法套路十一 ——回溯法之组合型回溯 该节是在上一节回溯法之子集型回溯的基础上进行描写&#xff0c;组合型回溯会在子集型回溯的基础上判断所选子集是否符合组合要求&#xff0c; 故请首先阅读上一节算法套路十——回溯法之子集型回溯 算法示例&#xff1a;LeetCode77. 组合…

【C++ 十八】C++ map/ multimap容器

C map/ multimap 容器 文章目录 C map/ multimap 容器前言1 map 基本概念2 map 构造和赋值3 map 大小和交换4 map 插入和删除5 map 查找和统计6 map 容器排序 总结 前言 本文包含map基本概念、map构造和赋值、map大小和交换、map插入和删除、map查找和统计、map容器排序。 1 m…

使用Glib中测试框架对C代码进行单元测试

C项目的测试框架比较常见的是Google的gtest&#xff08;前文CMake项目使用ctestgtest进行单元测试有使用实例介绍gtest&#xff0c;感兴趣的读者可以去看看&#xff09;&#xff0c;也有一些其它框架&#xff0c;比如Boost中的测试框架。这些框架虽然也可以测试C代码&#xff0…

Vue 消息订阅与发布

消息订阅与发布&#xff0c;也可以实现任意组件之间的通信。 订阅者&#xff1a;就相当于是我们&#xff0c;用于接收数据。 发布者&#xff1a;就相当于是媒体&#xff0c;用于传递数据。 安装消息订阅与发布插件&#xff1a; 在原生 JS 中 不太容易实现消息订阅与发布&…

Unity-ML-Agents-代码解读-RollerBall

使用版本&#xff1a;https://github.com/Unity-Technologies/ml-agents/releases/tag/release_19 文件路径&#xff1a;ml-agents-release_19/docs/Learning-Environment-Create-New.md 20和19的在rollerBall上一样&#xff1a;https://github.com/Unity-Technologies/ml-ag…

CSDN博客编写教程

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

osg widget 试用 方法

按钮 一个常见的 osg::Widget 就是按钮。下面的代码展示了如何使用 osg::Switch 和 osgText 创建一个简单的按钮&#xff1a; osg::ref_ptr<osg::Switch> buttonSwitch new osg::Switch(); osg::ref_ptr<osgText::Text> buttonText new osgText::Text(); buttonT…

浏览器不好用?插件来帮忙

一、目的 浏览器本身具备的功能并不完善&#xff0c;不同的用户可以为自己浏览器增加想要功能&#xff0c;使得浏览器更能符合自己的需求&#xff0c;提高浏览器使用的舒适度 二、推荐插件 AdblockPlus LastPass&#xff08;密码记录&#xff0c;全平台通用&#xff09; Dar…

JSON的用法和说明

JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式。 JSON建构于两种结构&#xff1a; "名称/值"对的集合。理解为对象 值的有序列表。理解为数组 JSON具有以下这些形式&#xff1a; 对象是一个无序的“ ’名称/值‘ 对”集合。一个…

阿里 Arthas (阿尔萨斯)工具的使用

目录 使用 一、安装与启动命令行控制台使用 使用 这款工具可以监控线上、测试或者其他环境的java运行中程序的情况&#xff0c;用于定位线上、测试等环境的问题。 一、安装与启动 通过termius远程登录测试或者线上环境&#xff0c;cd到指定目录下&#xff0c;输入命令&#…

高效部署Redis Sentinel模式(哨兵模式),手把手教学

Redis Sentinel模式部署 前言一、服务器部署同版本的redis1、换软件源在yum拉取包的时候启用remi源 二、修改配置文件1.修改/etc/redis.conf2.配置/etc/redis/sentinel.conf 三、启动redis服务1、启动服务2、连接redis3、检查redis 前言 这里就不过多的解释高可用的好处了&…

设计模式:行为型模式 - 迭代器模式

文章目录 1.概述2.结构3.案例实现4.优缺点5.使用场景6.JDK源码解析 1.概述 定义&#xff1a; 提供一个对象来顺序访问聚合对象中的一系列数据&#xff0c;而不暴露聚合对象的内部表示。 2.结构 迭代器模式主要包含以下角色&#xff1a; 抽象聚合&#xff08;Aggregate&…

Learn OpenCV by Examples - with Python

目录 关于OpenCV 新增内容 Content 1.锐化 2.阈值&#xff0c;二值化和自适应阈值 本文是自己在kaggle上学习OpenCV的学习笔记&#xff0c;如果对你有所帮助再好不过了。这是原文链接Learn OpenCV by Examples - with Python | Kaggle里面不仅有代码还有图片等。如果你还没…

网络安全-CDN绕过寻找真实IP

网络安全-CDN绕过寻找真实IP CDN就是CDN加速&#xff0c;就是根据你的目标让你访问的更快 CDN CDN&#xff0c;即内容分发网络&#xff0c;主要解决因传输距离和不同运营商节点造成的网络速度性能低下的问题。说得简单点&#xff0c;就是一组在不同运营商之间的对接节点上的…

Docker AIGC等大模型深度学习环境搭建(完整详细版)

本文是《Python从零开始进行AIGC大模型训练与推理》&#xff08;https://blog.csdn.net/suiyingy/article/details/130169592&#xff09;专栏的一部分&#xff0c;所述方法和步骤基本上是通用的&#xff0c;不局限于AIGC大模型深度学习环境。 Docker AIGC等大模型深度学习环境…

Go语言之反射(反射的简单使用,原理)

一、反射的基础 1.什么是反射 Go语言中&#xff0c;反射的机制就是在运行的时候&#xff0c;可以获取到其变量的类型和值&#xff0c;且可以对其类型和值进行检查&#xff0c;对其值进行修改。即在不知道具体的类型的情况下&#xff0c;可以用反射机制来查看变量类型、更新变…

50 Projects 50 Days - Hidden Search Widget 学习记录

项目地址 Hidden Search Widget 展示效果 Hidden Search Widget 实现思路 点击搜索按钮&#xff0c;展开输入框&#xff0c;主要元素就两个&#xff1a;input输入框和button&#xff0c;这两个本身就是行内元素。点击触发的动作拆分为两个&#xff0c;第一个是input输入框…