类 (class关键字) !!!引用类型
类是对一些具有相同属性和方法的具体食物的抽象;对象是类的具体实现
类的对象是指针的引用,赋值也只是创建一个指针对象,指向同样的内存区域。而值拷贝是完全不同的拷贝一份对象,和源对象截然不同。
类的两个主要内容:属性和方法
属性:所有类的对象所具有的共同特性或者类本身的属性
方法:类的对象所能做出的动作
/*
* 类 (class关键字) !!!引用类型
类是对一些具有相同属性和方法的具体食物的抽象;对象是类的具体实现
类的对象是指针的引用,赋值也只是创建一个指针对象,指向同样的内存区域。而值拷贝是完全不同的拷贝一份对象,和源对象截然不同。
类的两个主要内容: 属性 和 方法
属性:所有类的对象所具有的共同特性或者类本身的属性
方法:类的对象所能做出的动作
*/
class ClassRoom{//班级
var classId:Int?
var className:String?
}
class Student{//学生结
var classInfo = ClassRoom() //班级
var stuId = 0
var stuName = ""
var stuSex = true
}
var studet = Student()
studet.stuName = "明"
studet.classInfo = ClassRoom()
studet.classInfo.className = "小月"
print("学生:\(studet.stuName),班级:\(studet.classInfo.className)")
//对新对象赋值改变了源对象属性值
print("类--引用类型")
var stu1 = studet
var stu2 = Student()
stu1.stuName = "亮"
print(stu1.stuName)
print(studet.stuName)
//恒等操作符(===,!===)
print(stu1 === studet)
print(stu1 === stu2)
//类的哈希
class SomeObj:NSObject{
var name = ""
override class func hash() -> Int{
return "hello".hash
}
}
var someObj = SomeObj()
var some = SomeObj()
var dic:Dictionary<SomeObj,String> = [someObj:"hello",some:"hi"]
print("类的哈希")
print(dic)
//集合类型对象之间的赋值和拷贝
print("集合类型对象之间的赋值和拷贝")
print("(1)字典的赋值和拷贝")
//字典key是引用类型,进行字典之间赋值操作时,key值指向了同一个对象,进行赋值后改变key值属性会影响另外一个字典中key值
print("--字典key是引用类型")
someObj.name = "hello"
var dic1:Dictionary = [someObj:"hello"]
var dic2 = dic1
for key in dic1.keys{
key.name = "newHello"
print("\(key):\(key.name)")
}
for key in dic2.keys{
print("\(key):\(key.name)")
}
//字典中的value值是引用类型
print("--字典中的value值是引用类型")
var dic3:Dictionary = ["key3":someObj]
var dic4 = dic3
for key in dic3.keys{
print("\(key):\(dic3[key])")
}
for key in dic4.keys{
print("\(key):\(dic4[key])")
}
print("(2)数组的赋值和拷贝")
/*
*下列三种情况会发生拷贝行为
*[1]数组长度发生变化
*[2]使用数组unshare()方法
*[3]强制进行拷贝,调用数组copy()方法
在最新的beta3中,Array的行为已经变的和Dictionary一致了,都是值类型,去掉了copy和unshare方法。
*/
//一般情况进行数组赋值时,不会发生拷贝行为
var a = [1,2,3]
var b = a
var c = b
c[1] = 20
print(a)
print(c)
//[1]数组长度发生变化
print("(2)[1]数组长度发生变化")
a.append(5)
c[1] = 12
//监测属性值变化
print("监测属性值变化")
//willSet和didSet表示变量的即将改变和已经改变通知回调方法
class User{
init(name:String) {
userName = name
}
//默认参数newValue oldValue
var userName:String = ""{
willSet{
print("用户即将改变,新值:\(newValue)")
}
didSet{
print("用户已经改变,旧值:\(oldValue)")
}
}
}
var user = User(name:"san")
user.userName = "si"
//在对象中无法对对象属性进行修改
struct Students {
var stuName = ""
var stuAge = 0
//mutating 可以对其属性进行修改
mutating func reset(name:String,age:Int) {
stuName = name
stuAge = age
}
}
//类方法
print("\n类方法")
class School{
class func schoolName() -> String {
return "清华大学"
}
}
print(School.schoolName())
//单例设计模式
print("\n单例设计模式")
class Tool{
var toolName = ""
struct ToolParams {
static var tool:Tool? = nil
}
class func sharedTool() -> Tool{
if (!(ToolParams.tool != nil)){
ToolParams.tool = Tool()
}
return ToolParams.tool!
}
}
var tool = Tool.sharedTool()
tool.toolName = "测试"
print(tool.toolName)