Swift 结构体和类
//*---------------------结构体-------------*/
//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 结构体和类的更多相关文章
- Swift结构体与类
在面向过程的编程语言(如C语言)中,结构体用得比较多,但是面向对象之后,如在C++和Objective-C中,结构体已经很少使用了.这是因为结构体能够做的事情,类完全可以取而代之.而Swift语言却非 ...
- Swift结构体和类
Swift结构体 在Swift标准中,绝大多数的公开的类型都是结构体,而枚举和类只占很小的一部分 比如Bool.Int.Double.String.Array.Dictionary等常见的类型都是结构 ...
- iOS Swift结构体与类的方法调度
前言 hello,小伙伴们:在忙碌中闲暇之余给大家聊聊swift的知识点,今天给大家带来的是swift中结构体与类的方法调度详细区别,希望对你有所帮助,好了废话不用多说,接下来步入主题! 1.普通方法 ...
- 学习swift从青铜到王者之swift结构体和类08
定义 // 定义类 class StudentC{ } // 定义结构体 struct StudentS{ } 定义存储属性 // 定义类 class StudentC{ var name:Strin ...
- Swift具体解释之六----------------枚举、结构体、类
枚举.结构体.类 注:本文为作者自己总结.过于基础的就不再赘述 ,都是亲自測试的结果.如有错误或者遗漏的地方.欢迎指正,一起学习. 1.枚举 枚举是用来定义一组通用类型的一组相关值 ,关键字enum ...
- 10 结构体和类 - —— 《Swift3.0 从入门到出家》
Swift中的面向对象5个要素:枚举.结构体.类.协议.扩展 面向对象研究的是对象,完成一件事情需要多个对象参与,是生活的映射 Swift中结构体和类非常相似,也就是结构体能完成类的所有功能.结构体是 ...
- C#中结构体和类的区别
结构体和类同样能够定义字段,方法和构造函数,都能实例化对象,这样看来结构体和类的功能好像是一样的了,但是他们在数据的存储上是不一样的 C#结构体和类的区别问题:这两种数据类型的本质区别主要是各自指向的 ...
- C C++ 中结构体与类
先来说说C和C++中结构体的不同 a) C语言中的结构体不能为空,否则会报错 1>d:\myproject\visual studio 2013\projects\myc++\main.c(71 ...
- Swift 结构体的使用
Swift 结构体是构建代码所用的一种通用且灵活的构造体. 我们可以为结构体定义属性(常量.变量)和添加方法,从而扩展结构体的功能. 与 C 和 Objective C 不同的是: 结构体不需要包含实 ...
随机推荐
- C#中如何截取Windows消息来触发自定义事件
原文 C#中如何截取Windows消息来触发自定义事件 在c#windows开发中,我们常常会遇到拦截windows消息,来触发某个特定任务的问题. 由于目前使用c#的开发人员非常多,而且大多数c#程 ...
- MessagePack介绍
在项目中,服务端的人需要我研究messagepcak 进行数据的传输,对messagePack的了解就是传输的数据格式都是二进制,可以节省用户的流量,就因为这点 数据格式小,服务端决定采用msgpac ...
- ZOJ 3469 Food Delivery 区间DP
这道题我不会,看了网上的题解才会的,涨了姿势,现阶段还是感觉区间DP比较难,主要是太弱...QAQ 思路中其实有贪心的意思,n个住户加一个商店,分布在一维直线上,应该是从商店开始,先向两边距离近的送, ...
- -Xms 和 -Xmx 不能设置的太大
之前我一直有一个疑问,就是-Xms 和 -Xmx不是设置的越大越好吗?现在才明白怎么回事. 通过在命令行中执行 java 或者启动某种基于 Java 的中间件来运行 Java 应用程序时,Java 运 ...
- Java WebService简单使用
一直在写java但从来没有使用webservice,在网上查了下资料写个简单的使用放这里做备份 具体步骤: 1.新建一个java工程在里面写一个类(服务端)如下: package com.webser ...
- Python引用传值总结
Python函数的参数传值使用的是引用传值,也就是说传的是参数的内存地址值,因此在函数中改变参数的值,函数外也会改变. 这里需要注意的是如果传的参数类型是不可改变的,如String类型.元组类型,函数 ...
- JAVA——装箱和拆箱
Java 将某些基本数据类型自动转换为包装类型的过程称为装箱,相反自动将包装类型转换为基本数据类型的过程称为拆箱. Integer integer_1=1; //装箱 int i=integer_1; ...
- 有如下Student 对象, private String name; private int age; private int score; private String classNum; 其中,classNum
package homework003; import java.util.ArrayList; import java.util.List; public class Text { public s ...
- svn 如何解决冲突
项目中,往往不止你一人开发,多人开发,难免会有代码的冲突.彼此间谁也不能保证不会修改同个文件.如果修改了同个方法的内容.这时提交到svn是会提示代码冲突的. 当然,冲突是可控的,但不能避免.每次写代码 ...
- C#-禁止调整窗体的大小
要是想禁止调整窗体的大小,可以查看:FormBorderStyle属性,该属性的设置中有一个"FixedSingle"的选择项,它可以禁止调整窗体的大小.