import Foundation
print("Hello, World!")
/************结构体(struct)***************/
//1.声明一个结构体
struct Rect
{
// 声明结构体变量的属性(存储属性)
var x:Float
var y:Float
var width:Float
var height:Float
// 声明结构体属性
// 注意:需要使用 static 关键字修饰
static var description:String?
// 计算属性(专门用于计算其他属性, 并不存储值)
var centerX:Float{
// setter
set(new){
x = new
}
/*
set{
x = newValue
}
*/
// getter
get{
return x + width / 2
}
}
var centerY:Float{
get{
return y + width / 2
}
}
// 声明方法
// 声明一个结构体对象(结构体变量)方法[类似于类中的实例(对象)方法]
func info (){
print("x:\(x) y:\(y) width:\(width) height:\(height)")
}
// 声明结构体方法[类似于类中的类方法]
static func info1(){
print("这是一个结构体方法")
}
}
// 1.根据结构体类型, 创建结构体对象(结构体变量)
var rect1 = Rect(x: 0, y: 0, width: 100, height: 100)
// 注意: 如果结构体对象是常量, 内部的属性是不允许修改的
// 访问结构体对象的属性 (x,y,width,height)
rect1.x = 20
print(rect1.x)
// 访问结构体属性
Rect.description = "传说中的结构体"
print(Rect.description!) // 取值的时候 需要加感叹号! -> 强制解析的意思 去掉 optional
// 使用结构体对象方法
rect1.info()
// 使用结构体方法
Rect.info1()
// 访问结构体对象的计算属性
rect1.centerX = 100 // 调用 centerX 中的 setter 方法
let value = rect1.centerX // 在使用 centerX 中的 getter 方法
print(value)
/************类(class)的定义和实例*************/
class Person {
var name:String?
var age:Int?
// 构造方法(初始化方法)
init (name:String, age:Int){
self.name = name;
self.age = age;
}
}
// 创建一个 person 对象
var p1:Person = Person(name: "佩佩", age: 17)
// 访问类中的属性
print("名字是\(p1.name!)")
class Student {
// 声明对象属性
var name:String?
var age:Int?
// 声明类属性
static var introduce:String? //(!必须要由值, ?可以为空) [存储属性]
// 声明计算属性
var number:Int{
get{
return age!
}
set(value){ // 这种写法表示在调用 number 的 set 方法时, 传过来的参数赋值给 value
age = value // 切记切记: set 方法中不能使用 self. 属性, 会造成死循环
}
}
// 声明类方法
// ****static修饰的类方法不能被子类重写 class 修饰的类方法, 可以被子类重写
static func sayHi(){
print(introduce) // 注意类方法中 不能使用对象属性, 只能使用类属性
}
class func sayHi2(){
print(introduce)
}
// 声明构造方法
init(name:String, age:Int){
self.name = name
self.age = age
}
init(name:String){
self.name = name
}
// 声明对象方法
func sayHello(){
print("我是对象")
}
}
// 继承
class PP:Student{
// 重写父类的类方法
override class func sayHi2(){
print("我是 pp类, 重写父类的类方法")
}
}
// 多继承(>=2个类) 报错
//
let student = Student(name: "李四", age: 25)
student.sayHello() // 使用对象方法
Student.sayHi2() //使用的是类方法
PP.sayHi2() // 使用 PP 中重写父类的方法
// 创建 Student 对象
let pp:PP = PP(name: "小王", age: 23)
/******值类型和引用类型*******/
// 结构体
struct animal {
var name:String?
var age:Int?
}
var dog = animal(name: "小黄", age: 2)
var dog1 = dog // 此时, dog1是从 dog拷贝过来的值, 是一份新值
dog.name = "小花"
print("狗:\(dog.name!), 狗一:\(dog.name!)")
// 类
class animal1 {
var name:String?
var age:Int?
init (name:String, age:Int){
self.name = name
self.age = age
}
}
var cat = animal(name: "小黄", age: 3)
var cat1 = cat // 此时, dog1是从 dog拷贝过来的值, 是一份新值
cat.name = "小花"
print("狗:\(cat.name!), 狗一:\(cat1.name!)")