swift 类型汇总

好的!我来详细解释一下这些类型的概念和用法。

1. 值类型(Value Types)

值类型是指在赋值或传递时,变量会得到该值的副本,而不会引用原始数据。每个副本都有自己的独立存储空间,因此修改一个副本的值不会影响其他副本。这是与引用类型的主要区别。

  • 整型 (Int): 用来表示整数。例如:
    let age: Int = 25
    
  • 浮点型 (Float, Double): 用来表示带小数点的数值。Float是32位,Double是64位。推荐使用Double,因为它精度更高。
    let price: Double = 19.99
    
  • 布尔型 (Bool): 用来表示真假值,只有truefalse两种值。
    let isActive: Bool = true
    
  • 字符型 (Character): 用来表示单个字符,例如字母或符号。
    let letter: Character = "A"
    
  • 字符串型 (String): 用来表示一系列字符(即文本)。
    let name: String = "John"
    
  1. 结构体(struct

    结构体是值类型的一个重要实例。在Swift中,结构体不仅仅是一个容器,它们可以有属性、方法、初始化器和计算属性。使用结构体时,每次将结构体赋值或传递给函数,都会创建结构体的副本。

    示例:

    struct Point {
        var x: Int
        var y: Int
    }
    
    var point1 = Point(x: 5, y: 10)
    var point2 = point1 // 复制point1
    point2.x = 20
    print(point1.x) // 输出 5
    print(point2.x) // 输出 20
    

    在上面的示例中,point2point1的副本,对point2的修改不会影响point1

  2. 枚举(enum

    枚举类型也是值类型,每次赋值时也会创建副本。Swift中的枚举不仅可以存储相关的值,还可以有方法和计算属性。

    示例:

    enum Direction {
        case north
        case south
        case east
        case west
    }
    
    var currentDirection = Direction.north
    var newDirection = currentDirection // 创建副本
    newDirection = .east
    print(currentDirection) // 输出 "north"
    print(newDirection)     // 输出 "east"
    

    在这里,newDirectioncurrentDirection的副本,修改newDirection不会影响currentDirection

  3. 元组(tuple

    元组是一种非常灵活的值类型,它可以包含多个不同类型的元素。元组的赋值操作会复制所有的元素。

    示例:

    let person = (name: "John", age: 30)
    var anotherPerson = person // 创建副本
    anotherPerson.age = 35
    print(person.age)  // 输出 30
    print(anotherPerson.age)  // 输出 35
    

    在此示例中,anotherPersonperson的副本,修改anotherPerson的属性不会影响person

  4. 数组(Array)、字典(Dictionary)、集合(Set

    虽然数组、字典和集合在 Swift 中是值类型,但它们的行为更复杂。在数据量较小的情况下,它们会像其他值类型一样完全复制;但在遇到大数据时,Swift使用"写时复制"(Copy-on-Write)优化,这样当你修改数组或字典时,系统才会真正复制数据,而不是一开始就复制所有内容。这样做可以避免不必要的内存消耗。

    示例:

    var numbers = [1, 2, 3]
    var moreNumbers = numbers
    moreNumbers.append(4)
    
    print(numbers)      // 输出 [1, 2, 3]
    print(moreNumbers)  // 输出 [1, 2, 3, 4]
    

    在这个例子中,numbersmoreNumbers一开始是相同的,但当你修改moreNumbers时,它会创建numbers的副本。

为什么使用值类型?

  1. 线程安全:值类型在多线程环境中更为安全,因为每个线程都有自己的数据副本,不会互相干扰。引用类型需要额外处理线程安全性(例如使用锁或并发队列)。

  2. 简洁性:值类型的行为更直观。你不需要担心多个变量共享同一内存位置,避免了潜在的意外修改。

  3. 不变性:Swift中的结构体和枚举通常是不可变的(通过let常量声明),这让程序员在处理数据时更能确保一致性和安全性。

值类型与引用类型的对比

特性 值类型 引用类型
复制行为 每次赋值或传递时都会复制数据 每次赋值或传递时都会共享同一对象引用
内存管理 每个实例有自己的内存区域 多个引用共享同一内存区域
实例共享 不共享,修改副本不会影响原始数据 修改共享实例会影响所有引用该实例的变量
线程安全 更适合多线程环境 需要额外的同步机制
常见类型 结构体、枚举、元组、数组、字典、集合 类、闭包

值类型的优势与劣势

  • 优势

    • 简化数据管理:没有共享数据的风险,数据修改更可预测。
    • 避免意外修改:因为副本是独立的,不会影响到原始数据。
  • 劣势

    • 复制开销:当结构体或数组很大时,每次赋值都会复制数据,可能导致性能下降,尤其是在大量数据的情况下。
    • 内存使用:如果数据量很大,频繁复制可能会占用更多的内存。

值类型总结:值类型的核心特性是每次赋值都会创建数据的副本,这让它在处理简单数据模型时非常方便、安全。它们在多线程环境下表现得特别好,避免了数据共享和同步问题。但在处理大规模数据时可能会遇到性能问题,因为每次复制都需要耗费时间和内存。

2. 引用类型(Reference Types)

引用类型意味着赋值操作不会创建副本,而是创建对同一实例的引用。常见的引用类型包括:

  • 类 (Class): 类定义了对象的蓝图,可以包含属性和方法。类是引用类型,每次赋值后引用同一个实例。
    class Person {
        var name: String
        init(name: String) {
            self.name = name
        }
    }
    
    let person1 = Person(name: "Alice")
    let person2 = person1
    person2.name = "Bob"
    print(person1.name) // 输出 "Bob"
    
  • 闭包 (Closure): 闭包是一个可以传递和执行的代码块。例如:
    let greeting = {
        print("Hello, world!")
    }
    greeting() // 输出 "Hello, world!"
    

3. 可选类型(Optional Types)

可选类型用来表示某个值可能存在,也可能为nil。通过?标记为可选类型。

  • 普通可选 (Optional): 表示一个值可以是某种类型,也可以是nil

    var name: String? = "Alice"
    name = nil // name现在为nil
    
  • 隐式解包可选 (Implicitly Unwrapped Optionals): 这些可选类型一开始可能为nil,但可以放心假设它们在使用时不会为nil。用!标记。

    var name: String! = "Alice"
    print(name) // 输出 "Alice"
    

4. 协议类型(Protocol Types)

协议是Swift中定义方法和属性要求的机制。协议只定义行为(要求),而不提供实现。类、结构体或枚举可以遵循协议并实现协议要求的方法。

  • 协议 (Protocol):
    protocol Greetable {
        func greet() -> String
    }
    
    struct Person: Greetable {
        var name: String
        func greet() -> String {
            return "Hello, \(name)"
        }
    }
    
    let person = Person(name: "Alice")
    print(person.greet()) // 输出 "Hello, Alice"
    

5. 类型推断与泛型(Generics)

  • 类型推断 (Type Inference): Swift会自动推断变量的类型,通常你不需要显式声明类型。

    let number = 42 // 自动推断为Int
    let price = 19.99 // 自动推断为Double
    
  • 泛型 (Generics): 泛型让你编写能够处理多种数据类型的函数和类型。例如,你可以创建一个Stack类,它可以存储任何类型的元素:

    struct Stack<Element> {
        var items: [Element] = []
        
        mutating func push(_ item: Element) {
            items.append(item)
        }
        
        mutating func pop() -> Element? {
            return items.popLast()
        }
    }
    
    var intStack = Stack<Int>()
    intStack.push(10)
    let popped = intStack.pop() // popped是Optional类型,值为10
    

6. 类型别名(Type Aliases)

类型别名用来为类型提供一个新的名称。它通常用于简化复杂类型或提高代码可读性。

  • 类型别名 (typealias):

    typealias Distance = Double
    let tripDistance: Distance = 100.0
    

    也可以为闭包类型或复杂类型创建别名:

    typealias CompletionHandler = (Bool, String) -> Void
    

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 229,327评论 6 537
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 98,996评论 3 423
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 177,316评论 0 382
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,406评论 1 316
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,128评论 6 410
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,524评论 1 324
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,576评论 3 444
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,759评论 0 289
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,310评论 1 335
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,065评论 3 356
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,249评论 1 371
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,821评论 5 362
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,479评论 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,909评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,140评论 1 290
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,984评论 3 395
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,228评论 2 375

推荐阅读更多精彩内容