//使用class 和类名来创建一个类,类中属性的声明和常量,变量声明一样,唯一的区别就是它们的上下文是类,同样,方法和函数声明也一样
class Shape {
var numberOfSides = 0
func simpleDescription() -> String {
return "A shap with \(numberOfSides) sides."
}
}
//要创建一个类的实例,在类后面加上括号,使用点语法来访问实例的属性和方法
let shape = Shape()
shape.numberOfSides = 7
let shapeDescription = shape.simpleDescription()
print(shapeDescription)
//使用init来创建一个构造器
class NameShape {
var numberOfSides:NSInteger = 0
var name : String
init(name:String) {
self.name = name
}
func simpleDescription() -> String {
return "A shape with \(numberOfSides) \(name) sides."
}
}
//注意self被用来区别实例变量,当你创建实例的时候,像传入函数参数一样给类传入构造器的参数,每个属性都需要赋值-无论是通过声明(就像numberOfSides 还是通过构造器)
let nameShape = NameShape(name:"hello")
nameShape.numberOfSides = 10
let nameshapeDis = nameShape.simpleDescription()
print(nameshapeDis)
//如果需要在删除对象之前进行一些清理工作,使用deinit创建一个析构函数。子类的定义方法是在它们的类名后面加上父类的名字,用冒号分割。创建类的时候并不需要一个标准的根类,所以你可以忽略父类。子类如果要重写父类的方法的话,需要用override标记--如果没有添加override就重写父类方法的话编译器会报错,编译器同样会检测override标记的方法是否确实在父类中
class Square:NameShape {
var sideLength:Double
init(sideLength:Double ,name:String) {
self.sideLength = sideLength
super.init(name: name)
numberOfSides = 4
}
func area() -> Double {
return sideLength*sideLength
}
override func simpleDescription() -> String {
return "B square with sides of length \(sideLength)"
}
}
let test = Square(sideLength:5.2,name:"my test squate")
print(test.area(),test.simpleDescription())
//除了储存简单的属性之外,属性可以有getter 和 setter 。
class EquilateralTriangle:NameShape {
var sideLength:Double = 0.0
init(sideLength:Double,name:String) {
self.sideLength = sideLength
super.init(name: name)
numberOfSides = 3
}
var perimeter:Double {
get{
return 3.0 * sideLength
}
set{
sideLength = newValue / 3.0
}
}
override func simpleDescription() -> String {
return "An equilateral triagle with sides of length \(sideLength)."
}
}
var triangle = EquilateralTriangle(sideLength:3.1,name:"a triangle")
print(triangle.perimeter)
triangle.perimeter = 9.9
print(triangle.sideLength)
//在perimeter 的 setter 中,新值得名字是newValue。你可以在set之后显示的设置一个名字
//注意 EquilateralTriangle,类的构造器执行了三步:1,设置子类声明的属性值,2:调用父类的构造器,3:改变父类定义的属性值。其他的工作比如调用方法,getters和setters也可以在这个阶段完成。
//如果不需要计算属性,但是任然需要在设置一个新值之前或者之后运行代码,使用willSet和didSet。
//比如,下面的类确保三角形的边长总是和正方形的边长相同
class TriangleAndSuqare {
var triangle:EquilateralTriangle {
willSet{
square.sideLength = newValue.sideLength
}
}
var square:Square {
willSet{
triangle.sideLength = newValue.sideLength
}
}
init(size:Double,name:String) {
square = Square(sideLength:size,name:name)
triangle = EquilateralTriangle(sideLength:size,name:name)
}
}
let triangleAndSquare = TriangleAndSuqare(size: 10, name: "another test shape")
print(triangleAndSquare.square.sideLength)
print(triangleAndSquare.triangle.sideLength)
triangleAndSquare.square = Square(sideLength: 50, name: "larger square")
print(triangleAndSquare.triangle.sideLength)
//处理变量的可选值时,可以在操作(比如方法,属性,和子脚本)之前加?,如果?之前的值是nil,?后面的东西都会被忽略,并且整个表达式返回nil,否则,?之后的东西都会被运行,在这两种情况下,整个表达式的值也是一个可选值
let optionalSquare:Square? = Square(sideLength:2.5,name:"optional square")
let sideLength = optionalSquare?.sideLength
print(sideLength ?? 2)
Swift学习二 类和对象
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 怎样反思自己的教学——学习杜威《我们怎样思维》有感 2015-01-13 14:56:52 来源:普宁市第三中学网...
- “关外野店,烟火绝,客怎眠。”“客怎眠”说的实际是伤心人怎眠,词中主人公为追寻心上人而天涯羁旅,旅居关外小店,心...
- 2017.10.4 星期三 雨 今日中秋节,在家里陪家人赏月。乖乖的,哪里也不去啦!呵呵! 放弃...