import Foundation
/*
和类很相似 结构体 -> 封装
属性、方法
结构体是值类型
*/ //定义一个LSQ类型的结构体 关键字struct
struct LSQ {
var Name: String = ""
var Age: Int =
}
struct LSQ1 {
var Name: String
var Age: Int
}
struct LSQ2 {
var Name: String
var Age: Int=
} //结构体实例和属性访问
//声明一个变量
var liu : LSQ = LSQ()
var liu1 : LSQ1 = LSQ1(Name: "liuq", Age: )
liu.Age=
liu.Name="zhong" liu1.Name="ha"
liu1.Age= println(liu1.Name)
println(liu.Name)
var liu2 : LSQ2 = LSQ2(Name:"AA",Age:)
println("\(liu2.Age):\(liu2.Name)") //定义带有函数的结构体
struct m_lsq_1 { var Name : String = ""
var Age : Int =
func getName() -> String {
return Name
}
} var temp1 = m_lsq_1(Name: "王建国", Age:)
println(temp1.getName()) //结构体是值类型 不是引用类型
var temp2=temp1
println(temp2.getName())
temp2.Name="TempName"
println(temp2.getName()) /*

属性、方法
类是引用类型 class 类名 {
成员变量
成员方法

*/
//定义一个类
class m_class_1 {
func m_class_1() {
Name="m_Name"
Age=
}
var Name : String = ""
var Age : Int =
}
//引用类型
var class_1 = m_class_1() println(class_1) var class_2 = class_1 println(class_2) //当需要判断多个常量或变量是否是同一个实例时 用 === 恒等于 !== 不等于 判断
if class_1 === class_2 {
println("相同")
} /*
常量 结构体、枚举 是值类型, 常量不可修改,其属性不可修改
常量 类类型,是引用类型,常量不可修改,其属性可以修改
*/
//存储属性
//结构体存储属性
struct person {
var name : String //变量存储属性
let sex : String = "男" //常量存储属性
} var m_p = person(name: "lsq", sex: "男")
//常量属性不可修改
println(m_p.sex)
let m_p_1 = person(name: "t", sex: "n")
//m_p_1.name="lsq" // m_p_1是一个常量,其属性不可修改 //类存储属性
class c_person {
var name : String = "" //变量存储属性
let sex : String = "男" //常量存储属性
}
let c_p = c_person() //c_p 是一个常量,其属性可修改
c_p.name="lsq"
println(c_p.name) let c_p1 = c_person()
// c_p = c_p1 //类常量不可修改 //延迟存储属性
//swift中所有的存储属性必须有初始值,也就是当构造完一个类或结构体对象后,对象中所有的存储属性必须有初始值,但有例外,其中延迟存储属性可以将属性的初始化向后推迟到该属性第一次使用时赋值 关键字lazy
//使用延迟属性:1.属性不适合一开始就初始化,取决于外部对很多因素 2.属性有可能从来都不用,但是它对初始化会需要很长时间
//学生结构体
struct student {
var name : String
var age : Int
func get_name() {
println("我的姓名是:\(name)")
}
}
//班级类
class my_class {
var members : [student] = []
lazy var score : Double = self.getScore() //延迟属性 lazy关键字 score的值是 getScore()结果 当访问score时才去调用方法
//计算平均值
func getScore() -> Double {
var t: Double =
for i in members {
t += Double(i.age)
}
if members.count > {
return t / Double(members.count)
}
return
}
//显示所有name
func show () {
for i in members {
println(i.name)
}
}
func show_1() {
for i in members {
i.get_name()
}
} }
//常规用法
var s1 = student(name: "小明", age: )
var s2 = student(name: "小红", age: )
var c1 = my_class()
c1.members.append(s1)
c1.members.append(s2)
c1.show()
c1.show_1()
println(c1.getScore()) //使用延迟属性
var c2 = my_class()
c2.members.append(s1)
c2.members.append(s2)
println(c2.score) /*
计算属性
1.计算属性不直接存储其值,与存储属性不同,没有任何后端存储与之对应
2.计算属性用于计算,可以实现setter和getter 两种计算方法
3.枚举不可以有存储属性,但是允许有计算属性
对象.属性 = 某值 setter
let value = 对象.属性 getter
个人理解:与c#中的get set 相似,对象存放结果,每次获取结果需要计算
swift中的计算属性,不可以直接存储任何的值。 只读属性 如果计算属性只提供了get 没有提供set那么该属性是只读属性
*/ struct m_rect {
var origion: (x: Double,y: Double) = (,)
var size: (w: Double,h: Double) = (,)
//size是计算属性,不能直接赋值,
var center : (x: Double,y: Double) {
get {
//获取的值是重新计算的
return (origion.x + size.w/ , origion.y + size.h/)
}
set(n) {
//赋值的时候直接给 origion赋值
origion.x = n.x - size.w/
origion.y = n.y - size.h/
//origion.x = n.0 - size.w/2
//origion.y = n.1 - size.h/2
}
/*
当不指定n的时候,默认写法是 newValue 表示要赋的值
set {
//赋值的时候直接给 origion赋值
origion.x = newValue.x - size.w/2
origion.y = newValue.y - size.h/2
}
*/
}
} var rect = m_rect()
rect.size = (,)
println(rect.origion)
rect.center = ( ,)
println(rect.origion) /*
计算只读属性
如果计算属性只提供了get 没有提供set那么该属性是只读属性 */
//学生结构体
struct student_1 {
var name : String
var age : Int
func get_name() {
println("我的姓名是:\(name)")
}
}
//班级类
class my_class_1 {
var members : [student_1] = []
lazy var score : Double = self.getsum() //延迟属性
//计算属性 只读属性 只提供了get方法
var allage : Double { get{
return getsum()
}
}
//只读计算属性的简写 省略 get关键字
var allages : Double {
return getsum()
}
func getsum() -> Double {
var t: Double =
for i in members {
t += Double(i.age)
}
return t
} }
var c3 = my_class_1()
c3.members.append(student_1(name: "小明", age: ))
c3.members.append(student_1(name: "小红", age: ))
println(c3.allage) /*
属性观察器
当类中的属性或方法的某个值发生了变化,则调用指定的方法 在OC中称之为KVO
willSet 修改前被调用
didSet 属性被修改之后调用
相当于注册了两个事件 */
class my_class_3 {
var t_value : Double = {
willSet {
println("WillSet调用:\(newValue)")
}
didSet {
println("didSet调用:\(oldValue)")
}
} }
var m_3 = my_class_3()
m_3.t_value = //类型属性 可以理解为静态变量
//在结构体中用static关键字修饰 在class类中用class关键字修饰
struct type_property {
var property : Int =
//类型属性, 该变量属于当前类的 ,与其他语言中的静态变量相似 不同的是访问该变量时 只能通过类名.出该变量 所有实例化该类的对象共用此变量
static var static_property : Int =
}
var obj = type_property()
obj.property =
type_property.static_property =
 

初学swift笔记 结构体(八)的更多相关文章

  1. 5.Swift枚举|结构体|类|属性|方法|下标脚本|继承

    1. 枚举: ->在Swift中依然适用整数来标示枚举值,需搭配case关键字 enum  Celebrity{  case DongXie,XiDu,Nandi,BeiGai }  // 从左 ...

  2. Swift枚举|结构体|类|属性|方法|下标脚本|继承

    1. 枚举: ->在Swift中依然适用整数来标示枚举值,需搭配case关键字 enum  Celebrity{  case DongXie,XiDu,Nandi,BeiGai }  // 从左 ...

  3. Swift Struct 结构体

    前言 Swift 语言有两种基本的数据类型,即类(class)和结构体(struct),class 这样的概念大家不会陌生,而 struct 也并不是什么新的概念,在 Objective-C 和 C ...

  4. Swift 分类 结构体

    感谢原作者:http://www.cocoachina.com/newbie/basic/2014/0612/8780.html 类和结构体是人们构建代码所用的一种通用且灵活的构造体.为了在类和结构体 ...

  5. 瘋子C语言笔记(结构体/共用体/枚举篇)

    (一)结构体类型 1.简介: 例: struct date { int month; int day; int year; }; struct student { int num; char name ...

  6. iOS - Swift Struct 结构体

    1.Struct 的创建 1.1 基本定义 结构体的定义 // 定义结构体数据类型 struct BookInfo { // 每个属性变量都必须初始化 var ID:Int = 0 var Name: ...

  7. C语言学习笔记--结构体

    结构体定义三种方式: #include<stdio.h> //第一种定义方法 struct point { int x; int y; }; struct point p1,p2; //第 ...

  8. swift 类 结构体 作为参数 以及可变参数

    Class class Person{ var age = 22, name = "frank" func growolder() { self.age++ //++ 要跟住 不要 ...

  9. 初学swift笔记 方法(九)

    import Foundation /* 方法 */ //实例方法 一定需要依附于对象 class MyPoint { var x: Double = 0.0 var y: Double = 0.0 ...

随机推荐

  1. js中的this指向

    1, 指向window 全局变量 alert(this) //返回 [object Window] 全局函数 function sayHello(){ alert(this); } sayHello( ...

  2. Improving the AbiWord's Piece Table

    Improving the AbiWord's Piece Table[转] One of the most critical parts of any word processor is the b ...

  3. 七、适配器(Adapter)模式--结构模式(Structural Pattern)

    适配器模式:把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法在一起工作的两个类能够在一起工作. 类的 Adapter模式的结构: 类适配器类图: 由图中可以看出,Adaptee ...

  4. 微软的OneDrive研究~

    Dropbox 很好,唯一觉得不爽的是只能同步指定的目录.不过被墙之后就不那么方便了,所以改用微软的 Live Mesh,缺点是支持的设备少(仅 PC 和 Mac). https://technet. ...

  5. Qt中事件处理的方法(三种处理方法,四种覆盖event函数,notify函数,event过滤,事件处理器。然后继续传递给父窗口。可观察QWidget::event的源码,它是虚拟保护函数,可改写)

    一.Qt中事件处理的方式   1.事件处理模式一 首先是事件源产生事件,最后是事件处理器对这些事件进行处理.然而也许大家会问, Qt中有这么多类的事件,我们怎么样比较简便的处理每个事件呢?设想,如果是 ...

  6. UESTC_基爷与加法等式 2015 UESTC Training for Search Algorithm & String<Problem C>

    C - 基爷与加法等式 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Subm ...

  7. 剑指offer-面试题.二叉树的镜像

    题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像.  二叉树节点定义如下: strcut BinaryTreeNode { int val; strcut BinaryTreeNode* m_ ...

  8. 2.9 Model Selection and the Bias–Variance Tradeoff

    结论 模型复杂度↑Bias↓Variance↓ 例子 $y_i=f(x_i)+\epsilon_i,E(\epsilon_i)=0,Var(\epsilon_i)=\sigma^2$ 使用knn做预测 ...

  9. 【转】C++实现RTMP协议发送H.264编码及AAC编码的音视频

    RTMP(Real Time Messaging Protocol)是专门用来传输音视频数据的流媒体协议,最初由Macromedia 公司创建,后来归Adobe公司所有,是一种私有协议,主要用来联系F ...

  10. JSONObject和JSONArray的简单使用(json-lib)

    一. jar包 commons-lang.jar commons-beanutils.jar commons-collections.jar commons-logging.jar ezmorph.j ...