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


在 Swift 中类是建立灵活的构建块。类似于常量,变量和函数,用户可以定义的类的属性和方法。Swift给我们提供了声明类,而无需用户创建接口和实现文件的功能。Swift 允许我们创建类作为单个文件和外部接口,将默认在类一次初始化来创建。

使用类的好处:

  • 继承获得一个类的属性到其他类
  • 类型转换使用户能够在运行时检查类的类型
  • 初始化器需要处理释放内存资源
  • 引用计数允许类实例有一个以上的参考

类和结构的共同特征:

  • 属性被定义为存储值
  • 下标被定义为提供访问值
  • 方法被初始化来改善功能
  • 初始状态是由初始化函数定义
  • 功能被扩大,超出默认值
  • 确认协议功能标准

语法

代码如下:

Class classname {
   Definition 1
   Definition 2
    ---
   Definition N
}

定义类

代码如下:

class student{
   var studname: String
   var mark: Int
   var mark2: Int
}

创建一个实例的语法:

代码如下:

let studrecord = student()
示例
class MarksStruct {
   var mark: Int
   init(mark: Int) {
      self.mark = mark
   }
}

class studentMarks {
   var mark = 300
}
let marks = studentMarks()
println("Mark is \(marks.mark)")

当我们使用 playground 运行上面的程序,我们得到以下结果

Mark is 300

访问类属性作为引用类型
类属性可使用 '.' 语法来访问。属性名称由 "." 分离在实例名后。

代码如下:

class MarksStruct {
   var mark: Int
   init(mark: Int) {
      self.mark = mark
   }
}

class studentMarks {
   var mark1 = 300
   var mark2 = 400
   var mark3 = 900
}
let marks = studentMarks()
println("Mark1 is \(marks.mark1)")
println("Mark2 is \(marks.mark2)")
println("Mark3 is \(marks.mark3)")

当我们使用 playground 运行上面的程序,得到以下结果

Mark1 is 300
Mark2 is 400
Mark3 is 900

类标识符
在 Swift 引用多个常量和变量指向的单个实例。要了解常量和变量指向一个特定的类实例标识操作符的使用。 类实例总是通过引用传递。在类NSString,NSArray 和 NSDictionary 实例始终分配作为参考传递到现有的实例,而不是使用一个副本。

代码如下:

class SampleClass: Equatable {
   let myProperty: String
   init(s: String) {
      myProperty = s
   }
}
func ==(lhs: SampleClass, rhs: SampleClass) -> Bool {
   return lhs.myProperty == rhs.myProperty
}

let spClass1 = SampleClass(s: "Hello")
let spClass2 = SampleClass(s: "Hello")

spClass1 === spClass2 // false
println("\(spClass1)")

spClass1 !== spClass2 // true
println("\(spClass2)")

当我们使用 playground 运行上面的程序,得到以下结果

main.SampleClass
main.SampleClass

结构体
Swift 提供了利用构造作为结构的灵活的构建块。 通过利用这些结构的一次可以定义构建体的方法和属性。

这不同于 C 和 Objective C 编程:

结构不用要求实现文件和接口。

结构体使我们能够创建一个文件并自动扩展其接口到其它块。

在结构体中的变量值被复制并传递在后续的代码,通过返回的旧值的副本使得这些值不能被改变。

语法

代码如下:

Structures are defined with a 'Struct' Keyword.
struct nameStruct {
   Definition 1
   Definition 2
    ---
   Definition N
}

结构体的定义
考虑例如,假设要访问包含三个科目记录标记的学生并找出三个科目的总和。在这里,markStruct用于初始化的结构有三个标记,数据类型为 'Int'。

代码如下:

struct MarkStruct{
   var mark1: Int
   var mark2: Int
   var mark3: Int
}

访问结构体及属性
结构的成员是由它的结构名访问。 结构体的实例中由 'let' 关键字进行初始化。

代码如下:

struct studentMarks {
   var mark1 = 100
   var mark2 = 200
   var mark3 = 300
}
let marks = studentMarks()
println("Mark1 is \(marks.mark1)")
println("Mark2 is \(marks.mark2)")
println("Mark3 is \(marks.mark3)")

当我们使用 playground 运行上面的程序,得到以下结果:

Mark1 is 100
Mark2 is 200
Mark3 is 300

学生成绩需要访问结构名“studentMarks”。结构成员被初始化为 mark1, mark2, mark3 的整数类型值。然后,结构体 studentMarks()传递给 'marks' 使用 'let' 关键字。 'marks' 将包含结构成员的值。现在通过 '.' 访问结构的初始名称的值,并打印它。

代码如下:

struct MarksStruct {
   var mark: Int

init(mark: Int) {
      self.mark = mark
   }
}
var aStruct = MarksStruct(mark: 98)
var bStruct = aStruct // aStruct and bStruct are two structs with the same value!
bStruct.mark = 97
println(aStruct.mark) // 98
println(bStruct.mark) // 97

当我们使用 playground 运行上面的程序,得到以下结果:

98
97

结构体最佳使用方式
Swift 语言提供功能来定义的结构体作为自定义数据类型,用于构建功能块。 结构体的实例的值传递给定义块来进一步的操作。

需要有结构:

封装简单的数据值

使用“值”而不是“引用”复制封装数据到它的相关联属性

结构体为 “复制” 和 “引用”

在 swift 中结构体是通过其成员的值,而不是它的引用。

代码如下:

struct markStruct{
   var mark1: Int
   var mark2: Int
   var mark3: Int

init(mark1: Int, mark2: Int, mark3: Int){
      self.mark1 = mark1
      self.mark2 = mark2
      self.mark3 = mark3
   }
}

var marks = markStruct(mark1: 98, mark2: 96, mark3:100)
println(marks.mark1)
println(marks.mark2)
println(marks.mark3)

当我们使用 playground 运行上面的程序,得到以下结果:

98
96
100

另外一个实例

代码如下:

struct markStruct{
   var mark1: Int
   var mark2: Int
   var mark3: Int

init(mark1: Int, mark2: Int, mark3: Int){
      self.mark1 = mark1
      self.mark2 = mark2
      self.mark3 = mark3
   }
}

var fail = markStruct(mark1: 34, mark2: 42, mark3: 13)

println(fail.mark1)
println(fail.mark2)
println(fail.mark3)

当我们使用 playground 运行上面的程序,得到以下结果:

34
42
13

结构体 “markStruct” 需要它的成员首先定义:mark1, mark2 和 mark3. 现在,成员类的变量初始化容纳整数值。之后结构成员的副本使用 “self” 关键字创建。当结构成员的副本创建结构体块,其参数标记传递给 'marks' 变量,它现在将保存学生的分数。那么标记打印为 98, 96, 100。 下一步对于相同的结构成员的另一个实例命名为 'fail' 用于指向不同的标记相同结构体的成员。那么标记现在打印为 34, 42, 13. 这清楚地说明了结构会有成员变量的副本,传入成员到它们即将推出的功能块。

(0)

相关推荐

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

    前言 和其他语言不同的是,Swift不需要为自定义的类和结构体创建接口和实现文件.只需要创建单一文件用来创建类和结构体,其他的外部接口的代码系统会自动生成.下面这篇文章主要介绍了关于Swift 3.0类与结构体的内容,感兴趣的朋友一起来看看吧. 类和结构体区别 Swift的类和结构体具有以下相同的特点: 可以定义属性来保存值 可以定义方法来提供功能 可以定义下标来使用他们的值 可以定义初始化器来配置他们的初始化状态 可以在默认的实现上扩展他们的功能 遵从协议来提供标准的功能 类具有结构体没有的额

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

    一.引言 Swift中的类与结构体十分相似,和Objective-C不同的事,Swift中的结构体不仅可以定义属性,也可以像类一样为其定义方法. Swift中的类与结构体有如下相似点: 1.定义属性来存储值. 2.定义函数来提供功能. 3.通过定义下标语法使用下标的方式取值. 4.定义构造方法来对其进行初始化. 5.通过扩展来在原始基础上添加功能. 6.通过协议来定义实现标准. 当然类和结构体也有许多不同点,下面这些功能是类独有的,结构体没有: 1.通过继承来创建类的子类. 2.在运行时允许对类

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

    类 在 Swift 中类是建立灵活的构建块.类似于常量,变量和函数,用户可以定义的类的属性和方法.Swift给我们提供了声明类,而无需用户创建接口和实现文件的功能.Swift 允许我们创建类作为单个文件和外部接口,将默认在类一次初始化来创建. 使用类的好处: 继承获得一个类的属性到其他类 类型转换使用户能够在运行时检查类的类型 初始化器需要处理释放内存资源 引用计数允许类实例有一个以上的参考 类和结构的共同特征: 属性被定义为存储值 下标被定义为提供访问值 方法被初始化来改善功能 初始状态是由初

  • 详解R语言中的表达式、数学公式、特殊符号

      在R语言的绘图函数中,如果文本参数是合法的R语言表达式,那么这个表达式就被用Tex类似的规则进行文本格式化. y <- function(x) (exp(-(x^2)/2))/sqrt(2*pi) plot(y, -5, 5, main = expression(f(x) == frac(1,sqrt(2*pi))*e^(-frac(x^2,2))), lwd = 3, col = "blue") library(ggplot2) x <- seq(0, 2*pi, b

  • 详解Java语言中的抽象类与继承

    目录 一.实验目的 二.实验要求 三.实验报告要求 四.实验小结 一.实验目的 1.掌握抽象类的设计: 2.掌握抽象方法方法的实现: 3.熟悉类的向下向上转型,以及子类实例化父类对象的基本要求: 4.掌握通过类的继承实现抽象类. 二.实验要求 (一)编写一个Shape抽象类,其中包含有: 1个成员变量:表示长度,数据类型为double.当类为Circle时,表示半径:当类为Square时,表示其边长: 2个抽象方法area().perimeter(),分别用于计算图形的面积.周长. public

  • 详解Go语言中关于包导入必学的 8 个知识点

    1. 单行导入与多行导入 在 Go 语言中,一个包可包含多个 .go 文件(这些文件必须得在同一级文件夹中),只要这些 .go 文件的头部都使用 package 关键字声明了同一个包. 导入包主要可分为两种方式: 单行导入 import "fmt" import "sync" 多行导入 import( "fmt" "sync" ) 如你所见,Go 语言中 导入的包,必须得用双引号包含,在这里吐槽一下. 2. 使用别名 在一些场

  • 详解R语言中生存分析模型与时间依赖性ROC曲线可视化

    R语言简介 R是用于统计分析.绘图的语言和操作环境.R是属于GNU系统的一个自由.免费.源代码开放的软件,它是一个用于统计计算和统计制图的优秀工具. 人们通常使用接收者操作特征曲线(ROC)进行二元结果逻辑回归.但是,流行病学研究中感兴趣的结果通常是事件发生时间.使用随时间变化的时间依赖性ROC可以更全面地描述这种情况下的预测模型. 时间依赖性ROC定义 令 Mi为用于死亡率预测的基线(时间0)标量标记. 当随时间推移观察到结果时,其预测性能取决于评估时间 t.直观地说,在零时间测量的标记值应该

  • 详解R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型

    在标准线性模型中,我们假设 .当线性假设无法满足时,可以考虑使用其他方法. 多项式回归 扩展可能是假设某些多项式函数, 同样,在标准线性模型方法(使用GLM的条件正态分布)中,参数  可以使用最小二乘法获得,其中  在  . 即使此多项式模型不是真正的多项式模型,也可能仍然是一个很好的近似值 .实际上,根据 Stone-Weierstrass定理,如果  在某个区间上是连续的,则有一个统一的近似值  ,通过多项式函数. 仅作说明,请考虑以下数据集 db = data.frame(x=xr,y=y

  • 详解C语言中不同类型的数据转换规则

    不同类型数据间的混合运算与类型转换 1.自动类型转换 在C语言中,自动类型转换遵循以下规则: ①若参与运算量的类型不同,则先转换成同一类型,然后进行运算 ②转换按数据长度增加的方向进行,以保证精度不降低.如int型和long型运算时,先把int量转成long型后再进行运算 a.若两种类型的字节数不同,转换成字节数高的类型 b.若两种类型的字节数相同,且一种有符号,一种无符号,则转换成无符号类型 ③所有的浮点运算都是以双精度进行的,即使是两个float单精度量运算的表达式,也要先转换成double

  • 详解C语言中二分查找的运用技巧

    目录 基础的二分查 查找左侧边界 查找右侧边界 二分查找问题分析 实例1: 爱吃香蕉的珂珂 实例2:运送包裹 前篇文章聊到了二分查找的基础以及细节的处理问题,主要介绍了 查找和目标值相等的元素.查找第一个和目标值相等的元素.查找最后一个和目标值相等的元素 三种情况. 这些情况都适用于有序数组中查找指定元素 这个基本的场景,但实际应用中可能不会这么直接,甚至看了题目之后,都不会想到可以用二分查找算法来解决 . 本文就来分析下二分查找在实际中的应用,通过分析几个应用二分查找的实例,总结下能使用二分查

  • 详解Go语言中的数据类型及类型转换

    目录 1.基本数据类型 2.基础数据类型转换 3.基本数据类型转为字符串 4.strconv的使用 5.字符串转为基础类型 1.基本数据类型 数据类型有很多,先研究一下基础的,例如:布尔型.数字类型.字符串类型. 数字类型有uint8.uint16.uint32.uint64.int8.int16.int32.int64(uint和int区别在于uint为无符号整数,即只支持正数,不支持负数形式) 数字浮点型有fload32.float64.complex64.complex126(后面两个均为

  • 详解Go语言中的作用域和变量隐藏

    目录 前言 包隐藏 全局变量 类型强制 闭包 := 的情况 总结 前言 变量隐藏在 Go 中可能会令人困惑,让我们尝试弄清楚. package main import ( "fmt" "io/ioutil" "log" ) func main() { f, err := ioutil.TempFile("", "") if err != nil { log.Fatal(err) } defer f.Clos

随机推荐