结构体struct,类class
1.struct,值类型,结构体会自动生成初始化方法,class是引用类型
struct Person {
var name : String
var age : Int func simpleDescription() -> String {
return "name = \(name) , age = \(age)"
}
} let p = Person(name: "ly", age: )
let k = p.simpleDescription()
print(k)
2.1个结构体=另一个结构体,修改一个结构体的属性,另一个不变
let hd = Resolution(width: , height: )
// cinema 其实是 hd 的一个拷贝副本,而不是 hd 本身。尽管 hd 和 cinema 有着相同的宽(width)和高(heigh t),但是在幕后它们是两个完全不同的实例
var cinema = hd //修改cinema属性,hd的不会变
cinema.width = //如果是类class,修改的话,是会改变的
3.恒等运算符 等价于(===) 不等价于( !== )
作用:用于判定两个常量或者变量是否引用同一个类实例
4.选择结构体还是类来定义自定义数据类型
按照通用的准则,当符合一条或多条以下条件时,请考虑构建结构体:
• 该数据结构的主要目的是用来封装少量相关简单数据值。
• 有理由预计该数据结构的实例在被赋值或传递时,封装的数据将会被拷贝而不是被引用。
• 该数据结构中储存的值类型属性,也应该被拷贝,而不是被引用。
• 该数据结构不需要去继承另一个既有类型的属性或者行为。
举例来说,以下情境中适合使用结构体:
• 几何形状的大小,封装一个width 属性和height 属性,两者均为Double 类型。
• 一定范围内的路径,封装一个start 属性和length 属性,两者均为Int 类型。
• 三维坐标系内一点,封装x ,y 和 z属性,三者均为double 类型。
在所有其它案例中,定义一个类,生成一个它的实例,并通过引用来管理和传递。实际中,这意味着绝大部分的自定义数据构造都应该是类,而非结构体。
5.计算属性
struct Point {
var x = 0.0, y = 0.0
}
struct Size {
var width = 0.0, height = 0.0
}
struct Rect {
var origin = Point()
var size = Size()
var center: Point {
get {
let centerX = origin.x + (size.width / )
let centerY = origin.y + (size.height / )
return Point(x: centerX, y: centerY)
}
set {
origin.x = newValue.x - (size.width / )
origin.y = newValue.y - (size.height / )
}
}
}
var square = Rect(origin: Point(x: 0.0, y: 0.0),
size: Size(width: 10.0, height: 10.0))
let initialSquareCenter = square.center
square.center = Point(x: 15.0, y: 15.0)
print("square.origin is now at (\(square.origin.x), \(square.origin.y))")
// 打印 "square.origin is now at (10.0, 10.0)”
6.只读计算属性 只读计算属性的声明可以去掉 get 关键字和花括号
struct Cuboid {
var width = 0.0, height = 0.0, depth = 0.0
var volume: Double {
return width * height * depth
}
}
let fourByFiveByTwo = Cuboid(width: 4.0, height: 5.0, depth: 2.0)
print("the volume of fourByFiveByTwo is \(fourByFiveByTwo.volume)")
// 打印 "the volume of fourByFiveByTwo is 40.0"
7.属性观察器 (重要)
注意:你不可以为继承来的常量存储型属性或继承来的只读计算型属性添加属性观察器。这些属性的值是不可以被设置 的,所以,为它们提供willSet或didSet实现是不恰当
防止重写 :在方法/属性前加 final 例:final var
class StepCounter {
var totalSteps: Int = { didSet {
if totalSteps > oldValue {
print("Added \(totalSteps - oldValue) steps")
}
}
}
}
let stepCounter = StepCounter()
stepCounter.totalSteps =
8.类型属性
struct SomeStructure {
static var storedTypeProperty = "Some value."
static var computedTypeProperty: Int { get {
return
} set {
storedTypeProperty = "help"
}
}
} SomeStructure.computedTypeProperty =
print(SomeStructure.storedTypeProperty)
//输出:help enum SomeEnumeration {
static var storedTypeProperty = "Some value."
static var computedTypeProperty: Int {
return
}
} class SomeClass {
static var storedTypeProperty = "Some value."
static var computedTypeProperty: Int {
return
}
class var overrideableComputedTypeProperty: Int {
return
}
}
9.在实例方法中修改值类型 (结构体和枚举) mutating
struct Point {
var x = 0.0, y = 0.0
mutating func moveByX(deltaX: Double, y deltaY: Double) {
x += deltaX
y += deltaY
}
}
var somePoint = Point(x: 1.0, y: 1.0)
somePoint.moveByX(deltaX: 2.0, y: 3.0)
结构体struct,类class的更多相关文章
- 转载 C#结构体(struct)和类(class)的区别
转载原地址: http://dotnet.9sssd.com/csbase/art/8 C#结构体和类的区别问题:在C#编程语言中,类属于引用类型的数据类型,结构体属于值类型的数据类型,这两种数据类型 ...
- C++/C#:类Class与结构体Struct的区别
C++中: 默认的访问控制.继承访问权限不同:struct时public的,class时 private的: 其它基本一样. C#中: struct是值类型,class是引用类型的: struct S ...
- 你有对象类,我有结构体,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang结构体(struct)的使用EP06
再续前文,在面向对象层面,Python做到了超神:万物皆为对象,而Ruby,则干脆就是神:飞花摘叶皆可对象.二者都提供对象类操作以及继承的方式为面向对象张目,但Go lang显然有一些特立独行,因为它 ...
- 结构体struct 与 联合union
1.C语言中的结构体 1.1 定义 结构体是由一系列相同或不同类型的变量组成的集合. struct 结构体名{ //struct为关键字,“结构体名”为用户定义的类型标识. ...
- C#结构体和类的区别
1.不能在结构体中定义默认构造方法: 2.在结构体中的非默认构造方法中,必须对结构体中所有的字段进行初始化,否则将报错. 3.在类中声明字段的同时,可以初始化,字段的值.在结构体中不可以. 4.结构体 ...
- Swift结构体与类
在面向过程的编程语言(如C语言)中,结构体用得比较多,但是面向对象之后,如在C++和Objective-C中,结构体已经很少使用了.这是因为结构体能够做的事情,类完全可以取而代之.而Swift语言却非 ...
- Swift中元组(Tuples),结构体(Struct),枚举(Enums)之间的区别
Swift有许多种存储数据方式,你可以用枚举(enums),元组(tuples),结构体(structs),类(classes),在这篇文章中我们将比较枚举.元组.结构体之间区别,首先从最简单的开始- ...
- Swift - 2 (?和!、结构体、类、协议、扩展、闭包)
1> 可选类型(?)和强制解包(!) 在swift中,可选类型(?) 其根源是一个 枚举型,里面有 None 和 Some 两种类型.其实所谓的 nil 就是 Optional.None , 非 ...
- C C++ 中结构体与类
先来说说C和C++中结构体的不同 a) C语言中的结构体不能为空,否则会报错 1>d:\myproject\visual studio 2013\projects\myc++\main.c(71 ...
随机推荐
- 2020.2.21一些python总结
#字符串前面加r可以防止字符串转义 \也可以防止字符串转义#三引号可以实现输入多行文本#range(start,end,step)#列表 append添加一个元素到末尾 extend 添加一个素组到末 ...
- 吴裕雄--天生自然 JAVASCRIPT开发学习:函数调用
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 批量导出数据库表(oracle)
批量导出数据库表(oracle) 要求:导出sql文件,包含表结构和数据. 方案一 1:用cmd进入命令行输入:tnsping cmstar就是测试172.18.13.200是否连接成功2:导入与导出 ...
- JAVA 算法练习(一)
用java写了几道编程题目,分享给大家 语法和C语言几乎一样,不懂 java 会 c 也可以看明白的. 最大连续数列和 题目说明 对于一个有正有负的整数数组,请找出总和最大的连续数列.给定一个int数 ...
- JavaScript学习总结(三)
在学习完了基本的内容之后,我们来学习一下JavaScript中的对象部分以及如何自定义对象的问题. String对象 创建字符串的方式共有两种: 方式1:new String("内容&quo ...
- uploadify ASP.net 使用笔记
<script type="text/javascript" src="jquery.uploadify.min.js"></script & ...
- error_reporting() 设置 PHP 的报错级别并返回当前级别
error_reporting() 设置 PHP 的报错级别并返回当前级别. 语法 error_reporting(report_level) 如果参数 level 未指定,当前报错级别将被返回.下面 ...
- EXCEL启动慢
启动太慢,一般是加载项的问题. 1.点击文件-EXCEL选项 2. 找到加载项,一般是COM加载项 3.选择com加载项 4.然后我出现了无法更改的情况,于是,我做了以下调整,进入office安装目录 ...
- 17.3.12---urlparse模块的URL下载
1---urlparse模块是一个解析与泛解析Web网址URL字符串的一个工具 urlparse模块会将一个普通的url解析为6个部分,返回的数据类型都是元祖,同时,他还可以将已经分解后的url在组合 ...
- c# 之Enum--枚举
枚举 收藏的博文连接 枚举类型声明为一组相关的符号常数定义了一个类型名称.枚举用于“多项选择”场合,就是程序运行时从编译时已经设定的固定数目的“选择”中做出决定. 枚举类型(也称为枚举):该类型可以 ...