swift中为什么要存在swift3.0 结构体体

Swift:什么时候使用结构体和类_swiftgg吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:4贴子:
Swift:什么时候使用结构体和类
作者:Mike Ash,原文链接,原文日期:译者:Yake;校对:千叶知风;定稿:numbbbbb在Swift的世界中一个一直被持续不断讨论话题就是什么时候使用结构体什么时候使用类。我想我今天要贡献一些自己的想法。值 VS 引用答案其实很简单:当你需要值语义(值语义是指一个对象被系统标准的复制方式复制之后,与被复制的对象之间毫无关系,彼此独立改变且互不影响)的时候使用结构体,当你需要引用语义(引用语义是指一个对象被系统标准的复制方式复制后,与被复制的对象之间依然共享底层资源,对其中一个的改变都将影响到另外一个)的时候使用类。就是这样!欢迎下周再来。。。等等!怎么了?这没有回答这个问题什么意思?就是这样的啊!是的,但是。。。但是什么?什么是值语义和引用语义呢?哦,这个啊。也许我接下来应该讲讲这个。并且他们怎么和结构体和类相关联的呢?好的。所有的问题都归结于数据和数据被存储在什么地方。我们通常将数据存在在局部变量、参数、属性以及全局变量中。从根本上说有两种不同的方法将数据存储在所有这些地方。值语义中,数据直接存在于被存储的位置。引用语义中,数据存在于别的地方,而存储的位置中存储着一个对数据的引用。当你获取数据的时候这种差别可能不那么明显。而当你拷贝那块存储区域时这种不同就会显现出来。值语义中,你会获的原数据的一个新拷贝,而引用语义下,你会获的同样数据的引用的一个新拷贝。这真的很抽象。让我们来看一个例子,暂时把 Swift 的这个问题从你脑海中移除,让我们来看一个 Objective-C 的例子:
挂机一个月得百万,你还蓝瘦香菇么?
详情全文请移驾:
贴吧热议榜
使用签名档&&
保存至快速回贴Swift有许多种存储数据方式,你可以用枚举(enums),元组(tuples),结构体(structs),类(classes),在这篇文章中我们将比较枚举、元组、结构体之间区别,首先从最简单的开始-元组(tuples)。
关于伯乐头条
专注于IT互联网,分享业界最新动态。
新浪微博:
推荐微信号
(加好友请注明来意)
- 好的话题、有启发的回复、值得信赖的圈子
- 分享和发现有价值的内容与观点
- 为IT单身男女服务的征婚传播平台
- 优秀的工具资源导航
- 翻译传播优秀的外文文章
- 国内外的精选博客文章
- UI,网页,交互和用户体验
- 专注iOS技术分享
- 专注Android技术分享
- JavaScript, HTML5, CSS
- 专注Java技术分享
- 专注Python技术分享
& 2016 伯乐在线Posts - 172,
Articles - 1,
Comments - 85
20:02 by 甘超波, ... 阅读,
前面主要是介绍swift语言中基本类型的用法,今天给大家介绍的是swift的结构体的用法,swift中结构体的用法和其他语言的用法,还有不太一样,不过您多敲几遍,就可以理解结构体,结构体在ios开发中是灰常重要的一部分,如果您很好的掌握结构体,在后面ios开发中,会理解的更加清楚。
一:结构体声明
结构体名 {
1: struct
是定义结构体的关键字
1:struct 是结构体的关键字
2:student 结构体名称
3:student()
创建一个结构体变量
var stu = student () //student() 表示创建一个结构体变量
二 :结构体声明 字段
定义结构体字段2种方法
结构体名 {
第一种直接定义字段名 并且给字段名赋初始值
var 或 let
字段名 = 初始化值
第二种定义字段名并且指定字段类型
var 或 let
字段名:类型
age = 0 //直接定义一个字段名称,并且给字段名赋初始值
name:String // 直接定义一个字符串字段name。
三 :结构体声明 字段的访问
一: 创建结构体变量,结构体的字段都必须有初始值,否则会报错二: 结构体内部 只有在构造函数(init)中修改字段的值,在结构体内部中方法和属性内不能直接修改结构体内部字段的值。
三: 在结构体外部,结构体变量,可以访问结构体字段,也可以修改结构体字段的值。
①:构造函数给结构体字段 赋初始值
1: swift语言中指定结构体构造函数,是init方法
2:init执行方法,在创建结构体变量之前执行
3:在创建结构体题变量的参数必须和构造函数init 参数必须一致。
②:创建结构体变量赋初始值
在创建结构体变量,并且直接赋值给字段,其中注意点 赋初始值的顺序必须和声明结构体的顺序一致。
无参构造函数
age = 0 //直接定义一个字段名称,并且赋初始值
name:String // 直接定义一个字符串变量。
//定义 无参数构造函数
name = "zs"
/*1: student () 创建一个结构体变量 ,系统会自动调用构造函数init()
var stu = student ()
println("name=\(stu.name),age=\(stu.age)") 运行结果 name=zs,age=1
有参数构造函数
age = 0 //直接定义一个字段名称,并且赋初始值
name:String // 直接定义一个字符串变量。
//定义 有参数构造函数
init(Name:String,Age:Int) {
self.name = Name //self 指的是当前结构体变量
self.name 当前结构体的变量的字段
self.age = Age
1;student (Name:"ls",Age:12) 创建结构体变量 系统会调动构造函数,并且创建结构体的参数于构造函数参数一致
2:student (Name:"ls",Age:12) 后面跟着的参数名称必须于构造函数参数变量名相同
var stu = student (Name:"ls",Age:12)
//因为构造函数有2个参数,所对应创建结构体的变量的参数要一致
println("name=\(stu.name),age=\(stu.age)")
name=ls,age=12
有参数构造函数 参数变量加 _ 用法
创建结构体的对象中对应参数必须和构造函数对应的参数一致
2: 如果构造函数中参数变量前加 _ 其对应创建对象的参数,不需要变量名
struct Point{
var x = 0.0
var y = 0.0
init(_ x :Double ,_ y :Double){
self.x = x
self.y = y
init(_ x :Double ,_ y :Double) 构造函数中对应变量前面加 _ 其对应创建对象后面不需要变量名。
var p = Point(10.0,11.0)
println("x=\(p.x) y=\(p.y)")
创建结构体变量赋初始值
//直接定义一个字段名称,并且赋初始值
name:String?
// 直接定义一个字符串变量。
/*------创建结构体变量赋初始值
var stu = student(age:12,name:"甘超波")
1:创建一个结构体变量stu,其中字段 age 的值为12
name 的值为 "甘超波"
student()括号后面跟着参数 必须和定义结构体的字段的顺序一致
stu1 = student(name:"甘超波",age:12)
因为 创建结构体的变量中初始化字段的顺序和定义结构体声明字段的顺序不一致
var stu = student(age:12,name:"甘超波")
println("name=\(stu.name),age=\(stu.age)")
name=甘超波,age=12
结构体 方法
1:结构体中可以直接存储方法
注意点: 结构体中方法不能直接修改字段的值,否则会报错
//直接定义一个字段名称,并且赋初始值
//定义结构体方法
func GetAge() -&Int{
return age
注意点: 结构体中方法不能直接修改字段的值,否则会报错
var stu = student()
stu.age = 12
println(stu.age)
结构体属性
属性 主要是get set方法
struct Point{
var x = 0.0
var y = 0.0
var p = Point()
//声明属性 ,get set方法
var GPoint :Point{
set(newPoint){
p.x = newPoint.x
p.y = newPoint.y
var p = Point(x:10.0,y:11.0)
var CP = CPoint()
CP.GPoint = p
println("x=\(CP.GPoint.x),y=\(CP.GPoint.y)")
x=10.0,y=11.0
&系统提供常见结构体 有 Bool &Int Float Double &String 等&
&注意点:SWift语言中 String 是结构体类型
结构体值传递的时候都是
后面的文章,我回陆续把我学习到swift语言的知识写出来形成一个系列。由于是新语言,难免有不足,欢迎给我提出意见。也可以加我QQ 一起讨论,如果您有什么问题,也可以直接在QQ留言发给我,我看到之后第一时间回复您
&&最后总结一下。送上一直思维导图,作为文章的结束Swift中的值类型和引用类型(let和var使用注意)_美文阅读,精品文摘网
当前位置: &>&&>& >
Swift中的值类型和引用类型(let和var使用注意)
Swift编程模式思考
let被用于声明不变量,var被用于声明变量。不变量的值一旦被定义就不能再改变,变量则可以在声明之后被随意赋值。
和Java(static,final),C(static),OC(const)这种命令式编程语言中, 使用关键字说明一个变量不应被改变. 在这类语言中,不变量和变量相比,通常是不寻常的,次一等的概念。如果将一个名字关联到一个值,缺省的会得到一个变量,而不是不变量。如果,你需要一个不会改变,一直和某个特定值绑定的名字,就需要显式说明它是不变的。
变量来源于命令式编程范式, 不变量来源于函数式编程范式。
函数式编程以数学函数为建模基础。其变量的概念和数学中变量的概念是一致的。
在数学函数中,某个符号我们之所以称其为变量,是因为它可以用于代表不同的值。需要指明的是:当我们用明确的数值代入函数运算时,变量就拥有了明确的值。数学函数中不存在这种情况:某一次代换过程中,某个变量x一开始被代换为2,然后又变为3。这在数学上,没有任何意义。
Swift受到了函数式编程的影响,强化了不变量在语言中位置,鼓励不变量的使用。
值类型和引用类型
在Java中,可以认为原始类型(int,long,float,double,short,char,boolean)是值类型,而其它继承自Object的类型都是引用类型。
而在Swift中,结构体被设计成一种值类型。整数,浮点数,布尔值,字符串,数组和字典在Swift中都是以结构体的形式实现的,所以,它们也都是值类型。类(class)仍然是引用类型。
值类型在被赋给一个变量,或被传给函数时,实际是做了一次拷贝。引用类型在被赋给一个变量,或被传给函数时,传递的是引用。
例如:(引用类型)
class Point {
var x: Double
var y: Double
init(x: Double, y: Double) {
self.x = x
self.y = y
var p1 = Point(x: 1, y: 2)
var p2 = Point(x: 1, y: 2)
var p3 = p1
p1和p2是两个独立对象,p3是p1的别名。p1和p2对各自的修改互不影响, 而p1和p3可以认为是一个点。对其中任何一个的修改都会造成另一个也同样被修改。(p1和p2指向两块不同的内存地址,p1和p3指向同一块内存地址。)
如果改为值类型:
struct Point {
var x: Double
var y: Double
var p1 = Point(x: 1, y: 2)
var p2 = Point(x: 1, y: 2)
var p3 = p1
p3不再是p1的别名,而是p1的一个拷贝。
有一个问题:如果每次赋值都进行拷贝,会增大内存开销。Swift的解决方案是:只在值类型发生改变时才进行拷贝。
延伸阅读:
(责任编辑:美朵)
每日重点推荐
夏医生是自己多年老同事的儿子,国外学成归来做事业,老同事担心儿子诊所刚开,门厅罗雀伤了自尊,便偷偷塞钱给李梅,求她装病去“捧场”。
04-05 12-15 12-15
一周热点文章
在线阅读专题

我要回帖

更多关于 swift 类和结构体 的文章

 

随机推荐