Swift采用这样的设计思路也有其一定的优化道理,我比较了一下,给大家举一个最简单的例子,在使用Objective-C进行iOS开发时,经常会遇到这样的情况,某个控件中有一个UILabel控件,开发者在不想将控件暴漏在.h文件中的情况下经常会声明一个NSString类型的变量,重写此变量的set方法来完成对UILabel控件的赋值,仔细想来,实际上声明的这个NSString变量完全是多余的,它只是为了用来做中间值得传递,Swift的set和get方法就在这里进行了优化。另外,在set方法中会自动生成一个命名为newValue的变量作为传递进来的值,开发者也可以自定义这个变量的名称,在set后加小括号即可,示例如下:
var privateCount:Int{
get{
return count;
}
set(myValue) {
count=myValue+100
}
}
Swift中也提供了监听属性赋值过程的方法,其使用的是willSet与didSet机制,示例如下:
class MyClass {
var count:Int{
//赋值前执行(除了第一次初始赋值) 将要赋值的值以newValue传入
willSet{
print("will set \(newValue)")
}
//赋值后执行(除了第一次初始赋值) 原来的值以oldValue传入
didSet{
print("did set \(oldValue)")
}
}
let name = "珲少"
func run() {
print("run 100 miter")
}
init(){
count=200
}
}
九、枚举和结构体
Swift中的枚举和C与Objective-C有很大的差别,在Swift中,枚举也被作为一种数据类型来处理,其中可以添加函数方法。最基本的枚举用法如下所示:
//枚举可以多个case并列 也可以写在一个case中以逗号分隔
enum MyEnum {
case one
case tew
case three
case Fir,Sec,Thr
}
var em = MyEnum.one
如果变量是类型确定的枚举,在赋值时可以省略枚举名,示例如下:
var em:MyEnum = .one
Swift中的枚举还有一个原始值的概念,要使用原始值,必须在创建枚举类型时设置原始值的类型,示例如下:
enum MyEnum:Int {
case one=1
case tew
case three
case Fir,Sec,Thr
}
var em = MyEnum.one.rawValue
如果原始值是Int类型,则默认从0开始依次递增,开发者也可以手动设置每个枚举值的原始值。同样,也支持使用原始值来创建枚举实例,如下:
var em = MyEnum(rawValue:1)
通过原始值实例的枚举对象实际上回返回一个optional类型的值,如果传入的原始值参数不能匹配到任何一个枚举case,则可以使用if let结构进行判断处理。
在枚举中封装方法示例如下:
enum MyEnum:Int {
case one
case tew
case three
case Fir,Sec,Thr
func des() {
switch self {
case .one:
print("one")
default:
print("else")
}
}
}
var em = MyEnum(rawValue:1)
em?.des()
Swift中的枚举也可以添加附加值,在switch语句中取到对应的枚举类型后,可以获取开发者设置的附加值进行逻辑处理,示例如下:
enum MyEnum {
//为这个类型天啊及一组附加值
case one(String,Int)
case tew
case three
case Fir,Sec,Thr
func des() {
switch self {
case .one:
print("one")
default:
print("else")
}
}
}
var em = MyEnum.one("第一个元素", 1)
switch em {
//前面的let指定附加值为常量 或者用var指定为变量,括号内为附加值参数名
case let .one(param1, param2):
print("One param is \(param1) and two param is \(param2).")
default:
print("else")
}
Swift中使用struct关键字来进行结构体的创建,结构体的功能和类相似,支持属性与方法,但不同的是,结构体在传递时会被赋值,类的实例则会以引用的方式传递。