`

swift 类和结构体

阅读更多
1:类和结构体定义
类和结构体分别通过关键字class 和struct定义。
swift的编码风格是类class和结构体struct名字使用大写字母开头的匈牙利表示法,相反的。类的方法和属性则用小写字母开头的匈牙利表示法。
结构体总是通过被复制而进行代码传递的。
复制代码
struct SForm{
    var iXX:Int = 99
    var strHello:String = "dsf"
    func testFunc(iXX:Int)->Int{
        return iXX+1
    }
}

class CTset{
    var iAge:Int = 9
    var strName:String = "xx"
    func testFunction(iAge:Int)->Int{
        return iAge+1
    }
    func testFunctionName(strName:String)->String{
        return "oo"+strName
    }
}
复制代码

2:类和结构体实例

var structObj = SForm()
structObj.iXX = 988
let iRes = structObj.testFunc(4)
let clsObj = CTset()
clsObj.iAge = 987
let iRe:Int = clsObj.testFunction(32)
let iStr:String = clsObj.testFunctionName("sdf")

3:结构体初始化

结构体有一个自动生成的初始化器。新实例中各个属性的初始值可以通过属性的名称传递到成员逐一初始化器之中。

var objFirst = SForm(iXX:983, strHello:"hel")
objFirst.iXX = 87
let objSecond = SForm(iXX:94, strHello:"hwxel")
//objSecond.iXX = 876 error

4:结构体是值类型

var objFirst = SForm(iXX:983, strHello:"hel")
var objSecond = objFirst
objSecond.iXX = 5775
println("objFirst: \(objFirst.iXX)  objSecond:\(objSecond.iXX)")
输出:objFirst: 983  objSecond:5775

5:类是引用类型。

复制代码
let clsObj = CTset()
clsObj.iAge = 987
var clsObjEx:CTset = clsObj
clsObjEx.iAge = 874
println("\(clsObj.iAge)  \(clsObjEx.iAge)")
输出:clsObj: 874 clsObjEx: 874
复制代码

6:类的等价于运算=== 与不等价于 !== 运算 。表示是否是引用到同一个类对象

复制代码
let clsObj = CTset()
clsObj.iAge = 987
var clsObjEx:CTset = clsObj
clsObjEx.iAge = 874
if clsObj === clsObjEx {
    println("obj same")
}
复制代码

7:类和结构体区别。结构体是值类型,结构体的赋值意味着拷贝行为的发生。而类是引用类型。

8:集合类型的赋值和拷贝行为。

swift的数组和字典都是以值类型传递的。

8.1字典的拷贝。当有字典实例的赋值或者是字典做参数的函数调用时候,字典即发生拷贝行为。字典的key和value的拷贝行为是依赖于她自身到底是引用属性还是值类型。

var dicFirst:Dictionary = ["key1":"value1", "key2":"value2"]
var dicSecond:Dictionary = dicFirst
dicSecond["key1"] = "value1Update"
dicSecond的值被更新,而dicFirst的值依然保持不变。dicFirst和dicSecond是两个独立的字典。它的key和value在赋值时候发生了拷贝,因为都是String类型。
复制代码
class CTset{
    var iAge:Int = 9
    var strName:String = "xx"
    func testFunction(iAge:Int)->Int{
        return iAge+1
    }
    func testFunctionName(strName:String)->String{
        return "oo"+strName
    }
}

var clsObjFirst = CTset()
clsObjFirst.iAge = 443
var dicFirst:Dictionary = ["key1":clsObjFirst]
var dicSecond:Dictionary = dicFirst两个字典dicFirst 和 dicSecond分别为不同的字典,但它的值 clsObjFirst的地址却是同一个。因为它是类类型,是引用传递。
复制代码

 

8.2数组的赋值与拷贝。数组的拷贝行为只有在数组的长度发生变化的时候才会拷贝。当然数组里面的内容,是要遵循引用类型还是值类型的。

var arrayFirst = [1, 33]
var arraySecond = arrayFirst
arraySecond[0] = 89
//arrayFirst[0]和arraySecond[0] 都会被修改成 89 因为数组长度没变化,所以没发生拷贝
复制代码
var arrayFirst = [1, 33]
var arraySecond = arrayFirst
arrayFirst.append(222)//长度变化,arrayFirst拷贝,独立另外一个数组
arrayFirst[0] = 99
println("first:\(arrayFirst)\nsecond:\(arraySecond)")
输出:
first:[99, 33, 222]
second:[1, 33]
复制代码

 在用多个变量(var)引用一个数组时候,可以用unshare()方法,强制拷贝数组。

复制代码
var arrayFirst = [1, 2]
var arraySecond = arrayFirst
var arrayThird = arrayFirst
arraySecond.unshare()//拷贝独立成另外个数组
arrayThird.unshare()//拷贝独立成另外个数组
arrayFirst[0] = 3
arraySecond[0] = 4
arrayThird[0]=5
println("first:\(arrayFirst)\nsecond:\(arraySecond) \nthird:\(arrayThird)")
输出:
first:[3, 2]
second:[4, 2] 
third:[5, 2]
复制代码

8.3 数组等价于(===)和不等价于(!==) 

 

8.4强制复制数组

通过copy强制复制数组,进行的是数组类容浅拷贝,并返回个新的数组引用。

复制代码
var arraySource = [1, 2, 3]
var arrayCopy = arraySource.copy()
arraySource[0] = 4
arrayCopy[1] = 5
println("source:\(arraySource)\n copy:\(arrayCopy)")
输出:
source:[4, 2, 3] 
copy:[1, 5, 3]
分享到:
评论

相关推荐

    Swift 中的类和结构体:深入理解与应用

    在 Swift 编程语言中,类(Class)和结构体(Structure)是两种用于创建自定义数据类型的核心构造。尽管它们在功能上有许多相似之处,但它们之间也存在一些关键的区别,这些区别影响着开发者在不同场景下的选择。...

    swift菜鸟入门视频教程-09-类和结构体

    在Swift编程语言中,类(Class)和结构体(Structure)是两种主要的复合数据类型,它们用于封装数据和功能。本视频教程针对初学者,深入浅出地讲解了这两者的基本概念、特点以及如何在实际开发中使用它们。 首先,...

    详解Swift语言中的类与结构体

    在Swift编程语言中,类(Class)和结构体(Structure)是两种主要的数据类型,用于组织和封装数据以及相关的操作。它们都是复合类型,可以包含属性(Properties)、方法(Methods)、下标(Subscripts)以及初始化器...

    Swift语言教程:Swift 结构体教程

    Swift 结构体提供了强大的工具来组织和操作数据。通过定义属性和方法,结构体可以成为一个功能丰富的数据容器。此外,由于结构体的值传递特性,使得它们非常适合于那些需要在赋值或传递时拷贝数据的情况。理解结构体...

    swift-e-Where-事件App-一个实用的Swift3原型来快速构建App

    在这个项目中,你将看到如何通过创建自定义的Swift类和结构体来定义事件、地点等核心模型。 Swift的语法简洁明了,比如它的可选类型系统,可以防止空指针异常。在`e-Where`项目中,当你处理可能为空的数据时,如...

    swift-Jsonify是一个讨人喜欢的JSON解析Swift框架

    例如,如果你有一个名为`User`的Swift结构体,你可以定义一个协议`JsonConvertible`,然后实现其中的方法来使`User`结构体支持Jsonify: ```swift struct User: JsonConvertible { let name: String let email: ...

    swift-iOS自定义转场动画集锦

    WSLTransferAnimation-master这个库中,可能包含了一系列的Swift类和结构体,它们实现了各种自定义转场动画的效果。比如,常见的有淡入淡出、推拉、旋转、缩放、模糊等效果。开发者可以通过导入这些类并进行适当的...

    swift代码-结构体的运用

    总的来说,`swift代码-结构体的运用`这个主题涵盖了Swift编程中的一个重要方面,即如何利用结构体来组织和操作数据。通过学习和实践,开发者可以更好地理解和应用这一核心概念,提高代码的可读性和效率。

    Swift 3.0基础学习之类与结构体

    结构体和枚举是值类型,这意味着在赋值或传递时,它们的副本会被创建。例如,当 `cinema` 被重新赋值时,`hd` 的值不会受到影响。 相反,类定义使用 `class` 关键字,如 `VideoMode` 示例所示。类实例可以通过赋值...

    ios-模仿网易新闻导航栏.zip

    在创建自定义导航栏时,我们将使用Swift类和结构体来定义导航栏的外观和行为。 在实现过程中,我们可能要创建一个新的UIView子类来代表自定义导航栏。这个类将包含设置背景颜色、标题、按钮等属性的方法。例如: `...

    Atom-TIFeedParser,用swift编写的rss解析器。通过在github上创建一个帐户来促进tichise/tifeedparser的开发。.zip

    1. 源代码:项目的核心解析器代码,可能包括Swift类和结构体,用于解析RSS feed的XML结构。 2. 示例或测试:演示如何使用TIFeedParser的代码,帮助新用户快速上手。 3. 文档:可能包含README文件,解释了项目的用途...

    UI 基础 汤姆猫

    2. **Swift类和结构体**:可能包括自定义的视图控制器、视图和其他UI元素,以及处理业务逻辑的对象。 3. **Auto Layout和Size Classes**:用于适应不同屏幕尺寸和方向的界面布局技术。 4. **动画**:可能使用`UIView...

    The Swift Programming Language 中文版 - v1.81

    Swift 语言还提供了继承机制,允许类和结构体继承其他类或结构体的属性和方法。 在 Swift 语言中,下标是用于访问集合类型的元素的语法结构。下标可以是整数、字符串或其他类型,用于指定集合类型的元素。 Swift ...

    Swift中的类class与结构体struct体学习笔记

    Swift是一种强大的编程语言,它支持面向对象编程以及面向过程编程,这主要体现在它同时提供了类(Class)和结构体(Struct)两种数据类型。这两者有很多相似之处,但也有本质的区别,选择使用哪种取决于具体需求。 ...

    Swift4.0.3官方原版文档The Swift Programming Language(Swift4.0.3)

    7. **结构体与类**:Swift中的结构体和类都支持方法、属性和初始化器,但结构体是值类型,类是引用类型,这影响了它们的复制和赋值行为。 8. **自动引用计数(Automatic Reference Counting, ARC)**:Swift使用ARC...

Global site tag (gtag.js) - Google Analytics