Swift 结构体和类

时间:2022-06-04 23:48:39

//*---------------------结构体-------------*/

//swift结构体也具有封装的概念

//swift结构体比OC C语言里面的结构体更加进了一步,里面可以有方法,更接近我们的类

//结构体的定义格式 struct结构体名{成员变量}

struct rect {

var width:Double //按构造方法赋初值

var height:Double

//方法

func getHeightWidth() -> (x:Double,y:Double)//->返回类型位元组

{

return(width,height)

}

func sumHeightWidth() -> (Double)

{

return(width+height)

}

}

//声明结构体对象 var 变量名:结构体类型=结构体类型(参数)

//swift要求当定义一个结构体对象的时候,必须要对里面的变量赋一个固定的值

//结构体的构造方法(就是创建了一个结构体对象,首先他要分配内存空间(这一步由系统自行帮我们完成),分配完内存就会立即调用我们的初始化方法(构造方法)来对变量赋初值)

//swift的结构体初始化方法有两种 一种是成员逐一构造器var rect1:rect=rect(width: 100, height: 100) 一种是系统默认的不带任何参数的初始化方法struct rect {

//var width:Double=0.0 //按构造方法赋初值

//var height:Double=0.0

//}

//var rect1:rect=rect()

var rect1:rect=rect(width: 100, height: 100)

println("\(rect1.width),\(rect1.height)")

//调用

var c_n=rect1.getHeightWidth()

println(c_n)

var w_h=rect1.sumHeightWidth()

println(w_h)

//结构体的整体赋值

var rect3 = rect1

//整体赋值后的可能性有两种(1)rect3与rect1指向同一个内存空间(2)rect3与rect1内容一样,内存空间不一样

//验证方法有两种可以直接打印内存地址还有一种是改变值如果指向统一内存空间则赋值后的也应该改变成一样

rect1.width = 20

println(rect1.width)

println(rect3.width)

//值未变可以知道是第二种 即赋值后内容一样,内存空间不一样

/*----------------------类-----------------*/

//类与结构体在定义的格式上没有太大的区别,类在创建的时候必须要给里面的变量附一个初始值,因为类与结构体不一样,它没有成员逐一构造器

class rectww {

var width:Double=0.0

var height:Double=0.0

}

var re:rectww=rectww()

println("\(re.width),\(re.height)")

//类的整体赋值

//指向同一内存空空间

var ss = re

re.width = 200

println(re.width)

println(ss.width)

//===恒等 !==不等 只能用类

if ss===re{

println("同一个类")

}

else

{

println("不同")

}

//存储属性

//常量存储属性 :只能在构造对象的时候改变值之后不被允许改变

//延迟存储属性

//结构体常量和类常量与存储属性的关系

//结构体常量常量对象,本身是一个常量,对应的属性不可以通过修改它改变

struct person{

let name:NSString = "张三"//常量

var age:Int = 10//变量

}

let per:person=person(name: "李四", age: 20)//在构造对象的时候可以改变值之后不被允许改变 例如会报错//per.name = "王五" //per.age = 39

println(per.name)

//类本身是一个常量,属性可以通过修改它改变

class person1{

let name1:NSString = "张三"//常量

var age1:Int = 10//变量

}

let per1:person1=person1()//在构造对象的时候可以改变值之后不被允许改变 例如会报错

//per1.name1 = "王五"

per1.age1 = 39

println(per1.name1)

//延迟存储属性

/*

swift语言中所有的存储属性都必须要有初始值,也就是当调用完构造方法后对象中的所有变量都应该有一个初始值,但是延迟存储属性很例外,它的赋值并不都在调用构造方法的时候被初始化,而是在第一次被调用的时候初始化

*/

struct student {

var name:String

var chinese:Double

var math:Double

func showMyStudent(){

println("姓名:\(name),语文成绩:\(chinese),数学成绩:\(math)")

}

}

class myClass {

var array:[student]=[]

lazy var score :Double = self.getScore()//延迟

func getScore()->Double{

println("888888")

var t:Double = 0

for i in array

{

t+=i.chinese

t+=i.math

}

if array.count == 0

{

return 0

}

else

{

//swif里面只有隐式类型推断,没有隐式类型转换

return t/Double (array.count)

}

}

func show(){

for i in array

{

i.showMyStudent()//直接调用方法

}

}

}

let stu1 = student(name: "张三", chinese: 100, math: 100)

let stu2 = student(name: "李四", chinese: 100, math: 100)

//创建类的对象

let c0 = myClass()

c0.array.append(stu1)//加到数组

c0.array.append(stu2)

c0.show()

println(c0.getScore())

println("********")

//计算属性

/*

1.swift中的计算属性不能直接存储数据,与我们的存储属性不同,没有任何的"后端存储与之对应",简单来说就是在对对象中各种不占用存储空间

2.计算属性用于计算,可以实现setter和getter两种方法

*/

struct myRect {

var origin:(x:Double,y:Double)=(0,0)//坐标

var size:(w:Double,h:Double)=(10,10)

var center:(x:Double,y:Double)//中心点

{

//getter方法 当只有getter方法为只读 可以简写为一句return (origin.x+size.w/2,origin.y+size.h/2)

get{

return (origin.x+size.w/2,origin.y+size.h/2)

}

//setter方法

set(n){

//当sette没有传递参数时用newValue来代替n

origin.x=n.x-size.w/2

origin.y=n.y-size.h/2

}

}

}

var rect4 = myRect()

rect4.size=(100,100)

rect4.origin=(10,10)

//rect4.center=(rect4.origin.x+rect4.size.w/2,rect4.origin.y+rect4.size.h/2)

println(rect4.center)

//属性观察器

//用于观察属性变化,是指属性的值被修改时可以调用我们事先写好的一些代码段 类似oc中的kvo

//swift存在两种属性观察器

//1.willset 在设置新值的时候被调用的

//2.didset 在新值设置之后被调用

//不可以给延迟属性添加观察器 其他的都可以

class rr {

var a:String="nihao"{

willSet{

println("willSet,改变之前的值:\(a)")

println(newValue)

}

didSet{

println("didSet,改变之后的值:\(a)")

println(oldValue)

}

}

}

//改变值 先创建类的对象

var ass=rr()

ass.a="hehe"

//总结 结构体为值传递 类为引用

Swift 结构体和类的更多相关文章

  1. Swift结构体与类

    在面向过程的编程语言(如C语言)中,结构体用得比较多,但是面向对象之后,如在C++和Objective-C中,结构体已经很少使用了.这是因为结构体能够做的事情,类完全可以取而代之.而Swift语言却非 ...

  2. Swift结构体和类

    Swift结构体 在Swift标准中,绝大多数的公开的类型都是结构体,而枚举和类只占很小的一部分 比如Bool.Int.Double.String.Array.Dictionary等常见的类型都是结构 ...

  3. iOS Swift结构体与类的方法调度

    前言 hello,小伙伴们:在忙碌中闲暇之余给大家聊聊swift的知识点,今天给大家带来的是swift中结构体与类的方法调度详细区别,希望对你有所帮助,好了废话不用多说,接下来步入主题! 1.普通方法 ...

  4. 学习swift从青铜到王者之swift结构体和类08

    定义 // 定义类 class StudentC{ } // 定义结构体 struct StudentS{ } 定义存储属性 // 定义类 class StudentC{ var name:Strin ...

  5. Swift具体解释之六----------------枚举、结构体、类

    枚举.结构体.类 注:本文为作者自己总结.过于基础的就不再赘述 ,都是亲自測试的结果.如有错误或者遗漏的地方.欢迎指正,一起学习. 1.枚举 枚举是用来定义一组通用类型的一组相关值 ,关键字enum ...

  6. 10 结构体和类 - —— 《Swift3.0 从入门到出家》

    Swift中的面向对象5个要素:枚举.结构体.类.协议.扩展 面向对象研究的是对象,完成一件事情需要多个对象参与,是生活的映射 Swift中结构体和类非常相似,也就是结构体能完成类的所有功能.结构体是 ...

  7. C#中结构体和类的区别

    结构体和类同样能够定义字段,方法和构造函数,都能实例化对象,这样看来结构体和类的功能好像是一样的了,但是他们在数据的存储上是不一样的 C#结构体和类的区别问题:这两种数据类型的本质区别主要是各自指向的 ...

  8. C C++ 中结构体与类

    先来说说C和C++中结构体的不同 a) C语言中的结构体不能为空,否则会报错 1>d:\myproject\visual studio 2013\projects\myc++\main.c(71 ...

  9. Swift 结构体的使用

    Swift 结构体是构建代码所用的一种通用且灵活的构造体. 我们可以为结构体定义属性(常量.变量)和添加方法,从而扩展结构体的功能. 与 C 和 Objective C 不同的是: 结构体不需要包含实 ...

随机推荐

  1. react验证码倒计时

    <!DOCTYPE html> <html> <head> <script src="../build/react.js">< ...

  2. windows 下使用 Filezilla server 搭建 ftp 服务器

    windows 下使用 Filezilla server 搭建 ftp 服务器 1. Filezilla server 免费,开源, ftp 服务端 2. 下载安装, windows  https:/ ...

  3. spark yarn-cluster 和 yarn-client提交的配置

    1. spark conf 目录下需要配置进去hadoop home 2.需要spark 提交的配置文件 加上‘-- master yarn-cluster/yarn-client’设置提交的模式

  4. &lbrack;leetcode&rsqb;&lowbar;Longest Common Prefix

    问题:寻找最长公共前缀 思路:就是逐一检查每个string中的每一位,碰到不相等的时候,结束:每个string中这一位都相等,加入到common prefix中~ public String long ...

  5. ajax 请求二进制流 图片 文件 XMLHttpRequest 请求并处理二进制流数据 之最佳实践

    写在前面 :从提出需求到完美的解决问题,实现过程是曲折的. 需求:在前(web client)后(Restful Service)端完全解耦的模式框架下,webclient需要请求 Service 返 ...

  6. 企业生产环境下不同业务的linux分区建议

    常规分区方案: /boot:  100M swap:内存的1至1.5倍 / : 剩余硬盘大小 DB及存储:有大量重要的数据 /boot : 100M swap: 内存的1至1.5倍,如果内存大于等于1 ...

  7. NOIP刷题建议(未完结)

    1NOIP提高组真题 2NOI部分题目 为什么要写这个? 主要是一个人在硕大的机房里打(wan)代(you)码(xi),没多少时间了,所以打算来总结一下. 这个也是为我接下来冲刺做一个准备. 这个会不 ...

  8. redhat5 设置静态ip

    Last login: Sat Oct 14 16:19:13 2017 # 进入ip凭证文件设置地方 [root@oracle ~]# cd /etc/sysconfig/network-scrip ...

  9. 图解Git命令【转】

    本文转载自:https://github.com/geeeeeeeeek/git-recipes/wiki/4.1-%E5%9B%BE%E8%A7%A3Git%E5%91%BD%E4%BB%A4 此页 ...

  10. ModelAttribute注解使用与spring重定向传参

    @ModelAttribute可以用于修饰controller里的方法和参数,将被修饰的对象的值绑定到指定名称的属性里.当修饰方法时,方法返回的值会在该controller里每个访问处理前绑定一次.修 ...