Cowboy Tech

Swift面向对象基础(下)

值类型的类型属性-枚举

结构体可以包含实例计算属性,不能包含实例存储属性

enum Season {
//为枚举定义类型存储属性,使用可选类型,系统将其初始化为nil
static var desc:String?
//为枚举定义类型存储属性,且声明为常量
static let name = "季节"
static var info:String{

    get{

    return"代表季节的枚举,其desc为:\(desc)"

    }

    set{

    print("程序尝试对info计算属性进行赋值:\(newValue)")

    }
}
}
//对Season枚举的类型属性赋值
Season.desc = "季节类"
print(Season.name)
Season.info = "新的info"
print(Season.info)

值类型的类型属性-结构体

用static 修饰的是类型属性,需要通过类来调用

struct FkRange {

//为结构体定义类型存储属性,使用可选类型,系统将其初始化为nil
static var desc:String?
//为结构体定义类型存储属性,且声明为常量
static let maxWidth = 10000
static let maxHeight = 40000
//定义类型计算属性,该属性只有get部分,是一个只读属性
static var maxArea:Int{
return maxWidth * maxHeight
}
}

FkRange.desc = "描述范围的结构体"
print(FkRange.desc)
print(FkRange.maxWidth)
print(FkRange.maxHeight)
print(FkRange.maxArea)  

类的类型属性

类中不可以定义类型存储属性,只能包含类型计算属性

class User {

   //为类定义类型计算属性
class var nameMaxLength:Int {
    get {
    return 24
    }

    set {
    print("程序尝试对User类的nameMaxLength类型计算属性赋值:\(newValue)")
    }
}
}
print(User.nameMaxLength)
User.nameMaxLength = 20

使用闭包或函数为属性设置初始值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
struct ClosureInit {
// 使用闭包对test实例存储属性执行初始化
var test: Int = {
var dt = NSDate()
var gregorian = NSCalendar.currentCalendar()
// 定义一个时间字段的旗标,指定将会获取指定月、日信息
var unitFlags = NSCalendarUnit.CalendarUnitMonth
| NSCalendarUnit.CalendarUnitDay //这段代码有问题
var comp = gregorian.components(unitFlags
, fromDate:dt)
// 获取当前的月份
var month = Int(comp.month)
// 获取当前第几日
var day = Int(comp.day)
// 得到计算结果
return day - month
}()
}
var ci = ClosureInit()
print(ci.test)

值类型的类型方法

enum Season2{

 //为枚举定义类型存储属性,使用可选类型,系统将其初始化为nil
static var desc:String?

//为枚举定义类型存储属性,且声明为常量
static let name = "季节"

//定义无参数的类型方法
static func info(){

print("季节类的info方法,该类的name存储属性为:\(name)")
}

//定义带一个参数的类型方法
static func setDesc(desc:String){

self.desc = desc
}
}

Season2.info()
Season2.setDesc("描述季节变化的枚举")
print(Season2.desc)

类的类型方法

class Math {

   //类不允许定义类型存储属性,使用类型计算属性代替
class var pi:Double {
    return 3.1415926535
}

class func abs(value:Double)->Double {
    return value<0 ? -value:value
}

//定义类型方法,取消第二个形参的外部形参名
class func pow(base:Double,_ exponent:Int)->Double {
    var result = 1.0
    for idx in 1...exponent{
    result *= base
    }
    return result
}

//定义类型方法,类型方法可直接访问类型属性
class func radian2Degre(radian:Double)->Double {
    return radian * 180/pi
}

//定义类型方法,类型方法可通过self引用类型属性
class func degree2Radian(degree:Double)->Double {
    return degree * self.pi/180
}
}

print(Math.pi)
print(Math.pow(2, 4))
print(Math.radian2Degre(1.57))
print(Math.degree2Radian(45))