//关键词 class来定义类使用 struct来定义结构体
class Person {
}
struct SomeStruct {
}
//创建一个
struct OtherStruct {
var name = "slc"
var age = 24
}
class VidemModel {
var stru = OtherStruct()
var boo = false
var name : String?
}
//创建结构体和类的实例的语法是非常相似的:
//结构体和类两者都能使用初始化器语法来生成新的实例。初始化器语法最简单的是在类或结构体名字后面接一个空的圆括号,例如 Resolution()或者 VideoMode()。这样就创建了一个新的类或者结构体的实例,任何属性都被初始化为它们的默认值。在初始化一章有对类和结构体的初始化更详尽的描述。
let someResolution = OtherStruct()
let someVideoMode = VidemModel()
//你可以用点语法来访问一个实例的属性
print("mingzi(someResolution.name)")
print("shuxing(someVideoMode.boo)")
print("shuxing(someVideoMode.stru.age)")
//用点语法来指定一个新值到一个变量属性中:
someVideoMode.stru.name = "s"
//所有的结构体都有一个自动生成的成员初始化器,你可以使用它来初始化新结构体实例的成员属性。新实例属性的初始化值可以通过属性名称传递到成员初始化器中:
//与结构体不同,类实例不会接收默认的成员初始化器
let vgr = OtherStruct(name:"ss",age: 23)
//lazy 就是oc中的懒加载
//一个属性的初始值可能依赖于某些外部因素,当这些外部因素的值只有在实例的初始化完成后才能得到时,延迟属性就可以发挥作用了。而当属性的初始值需要执行复杂或代价高昂的配置才能获得,你又想要在需要时才执行,延迟属性就能够派上用场了
class dateInterface{
var filename = "name"
}
class dataString {
lazy var interface:dateInterface = dateInterface()
var data = ""
}
let da = dataString()
da.data.append("iloc")
let file = da.interface.filename //此时才加载lazy修饰的
/*
如果你有 Objective-C 的开发经验,那你应该知道在类实例里有两种方法来存储值和引用。另外,你还可以使用实例变量作为属性中所储存的值的备份存储。
Swift 把这些概念都统一到了属性声明里。Swift 属性没有与之相对应的实例变量,并且属性的后备存储不能被直接访问。这避免了不同环境中对值的访问的混淆并且将属性的声明简化为一条单一的、限定的语句。所有关于属性的信息——包括它的名字,类型和内存管理特征——都作为类的定义放在了同一个地方。
*/
//----------------------------------计算属性--------------------------------------------
//除了存储属性,类、结构体和枚举也能够定义计算属性,而它实际并不存储值。相反,他们提供一个读取器和一个可选的设置器来间接得到和设置其他的属性和值。
struct Point {
var x = 0.0,y = 0.0
}
struct Size {
var width = 0.0, height = 0.0
}
struct Rect {
var origin = Point()
var size = Size()
var center:Point {
get {
let centerX = origin.x + (size.width/2.0)
let centerY = origin.y + (size.height/2.0)
return Point(x: centerX,y: centerY)
}
set(newCenter){
origin.x = newCenter.x - (size.width/2.0)
origin.y = newCenter.y - (size.height/2.0)
}
}
}
var square = Rect(origin: Point(x: 1 ,y: 2),size:Size( 2,height: 3))
let cen = Point(x:2,y:3)
square.center = cen
print("square.origin is now at ((square.origin.x),(square.origin.y))")
/*
属性观察者会观察并对属性值的变化做出回应。每当一个属性的值被设置时,属性观察者都会被调用,即使这个值与该属性当前的值相同。
你可以为你定义的任意存储属性添加属性观察者,除了延迟存储属性。你也可以通过在子类里重写属性来为任何继承属性(无论是存储属性还是计算属性)添加属性观察者。属性重载将会在重写中详细描述。
*/
class StepCounter{
var totalStep:Int = 0{
willSet(newTotal){
print(newTotal)
}
didSet{
if oldValue > totalStep {
print(oldValue - totalStep)
}
}
}
}
let step:StepCounter = StepCounter()
step.totalStep = 10
step.totalStep = 5
//一个有读取器但是没有设置器的计算属性就是所谓的只读计算属性。只读计算属性返回一个值,也可以通过点语法访问,但是不能被修改为另一个值。
struct cooid{
var width = 0.0,height = 0.0,length = 0.0
var square:Double{
return width * height * length
}
//suqare是只读的
}
let cod = cooid.init( 3, height: 4, length: 5)
print(cod.square)