1.存储类型的属性的初始化
- 存储类型
struct YXRect {
var origin:CGPoint
var width:CGFloat
var height:CGFloat
}
- 存储类型的属性的初始化,存储类型的属性,在结构体或者对象创建的时候必须保证初始化一次
- 在初始化方法中初始化,在声明的时候没有初始化,那么在init函数中就是必须有的
//错误
//class YXRect {
// var origin:CGPoint
// var width:CGFloat
// var height:CGFloat
// init(width:CGFloat,height:CGFloat){
// self.width = width
// self.height = height
// }
//}
class YXRect {
var origin:CGPoint
var width:CGFloat
var height:CGFloat
init(origin:CGPoint,width:CGFloat,height:CGFloat){
self.origin = origin
self.width = width
self.height = height
}
}
- 直接在声明的时候初始化,在声明的时候有初始化的,在init函数中就不是必须的了
class YXRect {
var origin:CGPoint = CGPoint(x:1,y:1)
var width:CGFloat
var height:CGFloat
init(width:CGFloat,height:CGFloat){
self.width = width
self.height = height
}
}
- optional属性不强制初始化
//正确
class YXRect {
var origin:CGPoint?
var width:CGFloat
var height:CGFloat
init(width:CGFloat,height:CGFloat){
self.width = width
self.height = height
}
}
- struct会默认提供全部属性的init函数,而class不会
struct YXRect {
var origin:CGPoint
var width:CGFloat
var height:CGFloat
}
//错误
//class YXRect4 {
// var origin:CGPoint
// var width:CGFloat
// var height:CGFloat
//
//}
class YXRect{
var origin:CGPoint
var width:CGFloat
var height:CGFloat
init(origin:CGPoint,width:CGFloat,height:CGFloat){
self.origin = origin
self.width = width
self.height = height
}
}
2.存储类型属性的监听
struct YXRect {
var origin:CGPoint
var width:CGFloat{
willSet(newValue){
print("will set \(newValue)")
}
didSet(newValue){
print("did set \(newValue)")
if(newValue>200){
width = 200
}
}
}
var height:CGFloat
init(origin:CGPoint,width:CGFloat,height:CGFloat){
self.origin = origin
self.width = width
self.height = height
}
}
3.计算类型的属性
- 计算属性的获取
struct YXRect {
var origin:CGPoint
var width:CGFloat
var height:CGFloat
init(origin:CGPoint,width:CGFloat,height:CGFloat){
self.origin = origin
self.width = width
self.height = height
}
//只有获取的时候不需要加上get关键字
var center : CGPoint {
print("获取center")
let x = self.origin.x + self.width*0.5
let y = self.origin.y + self.height * 0.5
return CGPoint(x:x,y:y)
}
}
- 计算属性的设置
struct YXRect {
var origin:CGPoint
var width:CGFloat
var height:CGFloat
init(origin:CGPoint,width:CGFloat,height:CGFloat){
self.origin = origin
self.width = width
self.height = height
}
//有获取,也有设置就需要加上get 和 set方法
var center : CGPoint {
get{
print("获取center2")
let x = self.origin.x + self.width*0.5
let y = self.origin.y + self.height * 0.5
return CGPoint(x:x,y:y)
}
set(newValue){
print("设置center2")
self.origin.x = newValue.x - self.width * 0.5
self.origin.y = newValue.y - self.height * 0.5
}
}
}
4.懒加载属性
class Account{
var name : String
//懒加载属性的self容易造成链循环,从而导致self不能释放,此处应使用unowned
lazy var hellow :String = {[unowned self] in
print("初始化拉")
return "hellow \(self.name)"
}()
init(name:String){
self.name = name
}
}
var accout = Account(name:"aaa")
accout.hellow
accout.hellow
accout.hellow
//"初始化啦"只打印一次
5.类的静态属性
Swift中可以像java一样在一个类中声明一个静态变量
而OC必须借助类方法才能达到这样的效果
- Swift
class Person {
static var type = "地球人"
}
//这样就可以直接访问
Person.type //地球人
- OC
@interface Person : NSObject
+(NSString *)type;
@end
@implementation Person
static NSString *type = @"地球人";
+(NSString *)type{
return type;
}
@end
[Person type];
可见相比较而言还是Swift语法,更加简练一些。
网友评论