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

这篇具有很好参考价值的文章主要介绍了ios客户端学习笔记(五):学习Swift的关键字和容易弄混的符号。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

新找到一篇文,也比较全 swift 5.1语法 1小时入门

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
    ios客户端学习笔记(五):学习Swift的关键字和容易弄混的符号

示例代码:

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中的成员的值便被保护起来,不能修改
    下面是使用mutating关键字的具体代码实例:
protocol Vehicle {
    var speed: Double { get set }
    mutating func accelerate(by delta: Double)
}

struct Car: Vehicle {
    var speed: Double = 0
    
    mutating func accelerate(by delta: Double) {
        speed += delta
    }
}

var car = Car()
print(car.speed) // 0

car.accelerate(by: 50)
print(car.speed) // 50

在上面的代码中,我们定义了一个Vehicle协议,其中包含一个可读写的speed属性和一个mutating方法accelerate(by:),用于加速车辆。然后我们定义了一个Car结构体,实现了Vehicle协议,并且在accelerate(by:)方法前面加上了mutating关键字,以便于修改Car结构体中的属性speed。最后,我们创建了一个Car实例,并调用accelerate(by:)方法加速,成功修改了speed属性的值。

如果我们在accelerate(by:)方法前面不加mutating关键字,那么编译器会报错,提示我们不能在结构体中修改属性的值。

另外可看Swift中常用关键字

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

1) ?

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。

实践

class Person{
    var mac: Mac?
    init?(mac: Mac?){
        guard let mac = mac else { return nil }
        self.mac = mac
    }
    
    // swift中的下标语法,使得获取某些值更加便捷。
    subscript(index: String) -> Int {
        switch index {
            case "count": return self.mac?.name.count ?? 0
            default:
                return 0
        }
    }
}
 
class Mac{
    let name: String = "mac book pro"
}
 
let person = Person(mac: nil)
 
print(person?.mac?.name.count ?? 0)
print(person?["count"] ?? 0)

下面是代码中每个含?号的语句的含义注释:

  1. init?(mac: Mac?): 这是一个可失败的初始化方法,参数为可选类型的Mac对象。如果传入的Mac对象为nil,则初始化会失败,返回nil;否则,会将传入的Mac对象赋值给类属性mac,初始化成功。

  2. self.mac?.name.count: 这是一个可选链式调用,表示如果mac不为nil,则获取mac的name属性的字符数量;否则,返回nil。

  3. print(person?.mac?.name.count ?? 0): 这是一个可选链式调用,表示如果person不为nil,则获取person的mac属性的name属性的字符数量;否则,返回0。

  4. print(person?["count"] ?? 0): 这是一个下标语法,表示如果person不为nil,则获取person的下标为"count"的值;否则,返回0。在Person类中,下标的实现是获取mac的name属性的字符数量。

2) !

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

optionalInteger = 42
optionalInteger! // 42

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

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

来源:菜鸟教程文章来源地址https://www.toymoban.com/news/detail-421164.html

到了这里,关于ios客户端学习笔记(五):学习Swift的关键字和容易弄混的符号的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (学习笔记-TCP连接断开)建立了连接,但是客户端或服务端出现问题,会怎么样?

    客户端出现故障指的是客户端的主机发生了宕机或者断电的场景。发生这种情况的时候,如果服务端一直不会发送数据给客户端,那么服务端是永远无法感知到客户端宕机这件事的,也就是服务端的TCP连接将一直处于 ESTABLISH 状态,占用着资源。 为了避免这种情况,TCP有一个

    2024年02月16日
    浏览(46)
  • Flask框架小程序后端分离开发学习笔记《3》客户端向服务器端发送请求

    Flask是使用python的后端,由于小程序需要后端开发,遂学习一下后端开发。 可以看到上述代码构建了一个HTTP请求,在发送之前需要将发送之前,使用http_request.encode(‘utf-8’)。 这是因为我们在这构建的请求是字符串文本,而电脑只认识二进制0和1,所以需要将其数据类型转换

    2024年01月22日
    浏览(54)
  • Android、IOS客户端RSA密钥生成

    目录 OpenSSL介绍 使用OpenSSL 生成私钥 生成公钥 生成Java和Android的私钥 创建证书请求文件 生成数字证书 生成iOS使用的公钥文件 生成iOS使用的私钥文件 关于什么是密钥、RSA加密等相关知识之前有说过,不熟悉的可以看下这个文章。 链接:公钥、私钥、对称加密、非对称加密、

    2024年02月05日
    浏览(78)
  • 关于ios客户端与web网页js交互

    iOS与JS的交互可以通过以下几种方式实现: 1.使用UIWebView或WKWebView加载Html页面并在其中添加Javascript脚本,通过WebView的代理方法捕获Javascript脚本发出的事件,从而实现与iOS原生代码的交互。 2.使用JSBridge框架,它提供了一种简单的方式在Javascript和iOS原生代码之间进行通信。

    2024年02月10日
    浏览(45)
  • IO模型之epoll实现服务器客户端收发

     epoll.ser epoll.cri result      

    2024年02月13日
    浏览(56)
  • 使用socket.io简单实现多客户端可编辑表格

    之前看了B站小野森森老师的可编辑表格的视频深受启发,今天使用React简单实现一下。 当处于编辑状态的时候,自己和其他人可以看到; 编辑内容后,自己及其他人可以同步看到修改后的内容; 后端服务,使用socket.io起一个后端服务,用于监听连接和发送数据; 前端准备:

    2024年02月06日
    浏览(49)
  • UnityMirror学习笔记(3):服务器与客户端间的函数调用,互发控制指令:Command,ClientRpc,TargetRpc

    Mirror是一个简单高效的开源的Unity多人游戏网络框架。 官方文档链接: https://mirror-networking.gitbook.io/docs API Mirror提供了一个特性 Command 来进行从客户端到服务器的远程控制指令, 它的核心逻辑就是,当 客户端 的脚本调用此特性修饰的函数时, 服务端 的 对应的对象 执行此函数

    2024年02月07日
    浏览(41)
  • openGauss学习笔记-102 openGauss 数据库管理-管理数据库安全-客户端接入之查看数据库连接数

    102.1 背景信息 当用户连接数达到上限后,无法建立新的连接。因此,当数据库管理员发现某用户无法连接到数据库时,需要查看是否连接数达到了上限。控制数据库连接的主要以下几种选项。 全局的最大连接数:由运行参数max_connections指定。 某用户的连接数:在创建用户时

    2024年02月07日
    浏览(63)
  • 语音识别无限次数GPT-4,OpenAI的iOS客户端太强大了

    语音识别无限次数GPT-4,OpenAI的iOS客户端太强大了 你可能已经听说过OpenAI这个神秘的组织,它是由马斯克、霍金等名人发起的一个非营利性的人工智能研究机构,旨在创造和推广友善的人工智能,让人类受益。 OpenAI最出名的产品就是ChatGPT,一个基于GPT-3和GPT-4模型的智能对话

    2024年02月08日
    浏览(37)
  • 关于项目中websocket的socket.io客户端js库的应用

    sockt.io 在前端使用的js库需要知道哪些内容? 如何建立链接  io(\\\'地址\\\') 连接成功的事件  connect 如何发消息  emit  + 事件 如何收消息  on  + 事件 如果关闭连接  close() chatMsgList   接收 聊天记录 sendChatMsg  发送消息 receiveChatMsg   接收 消息 updateMsgStatus  消息已读 getChatMsgLis

    2024年02月19日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包