Swift学习笔记1

       最近在学Swift,记录一下自己遇到的问题吧。

       想一起自学的朋友可以从这学习基础部分:点击打开链接

笔记部分:

1、as!和as?的区别

as?返回的是显式可选类型,赋值时需要可选绑定值:

let nameSpace = NSBundle.mainBundle().infoDictionary!["CFBundleExecutable”]as? String

let a = nameSpace

print(a)

这段代码执行结果为:

Optional(YourNameSpace)

即如果不进行可选绑定,再次赋值给a,a仍是可选类型。想要把执行结果的Optional给去掉有三种方式:

*直接对nameSpace强制解包:let a = nameSpace!,这种方法如果a为nil的话会直接崩溃。

*对a进行可选绑定:if let a = nameSpace{…},这种方法只有a不为空才会执行大括号里面的代码。

*给nameSpace赋值时直接设置为隐式可选类型:

let nameSpace = NSBundle.mainBundle().infoDictionary!["CFBundleExecutable”]as! String,

这种方法同第一种,如果没有取到值程序会直接崩溃,所以只有当我们确保返回值存在时才使用 ’ ! ’ 强制解包。


2、给UIButton添加监听的时候:

button.addTarget(self, action: #selector(addBtnClick), forControlEvents: UIControlEvents.TouchUpInside)

如果我把定义的方法addBtnClick加上关键字private,则编译报错,说我使用了OC的方法,让我加上@objc关键字:@objc private func addBtnClick(),但如果我把private删掉就没问题:func addBtnClick()。因为按钮的点击事件是由runloop监听并以消息机制传递,这种机制是属于OC的运行时机制,调用方法都是在运行时动态查找和派发,Swift为了提高性能,所有方法都是在编译时已经确定,即不会在运行时动态去查找派发,所以如果你给按钮的点击方法加上了private关键字,在运行时是找不到的,所以要加上@objc关键字把这个方法暴露给OC。


3、必须构造器:

构造器若前面加上了一个required关键字,则所有子类只要定义了构造方法都必须实现该构造方法。若子类没有定义构造器,默认会继承父类的构造器,所以不用重写。重写必须构造器不需要加上override,而是还需要加上required,因为系统看到了required关键字会自动去找父类的构造器,而且还保证了所有其下子类仍必须重写该构造方法。


4、fatalError:

Swift里面并没有抽象函数的概念,但是某些时候我们又总有这种需求:父类的方法不希望被随便调用,子类还必须实现。在面对这种情况时,为了确保子类实现这些方法,而父类的方法不会被随便调用,我们可以使用fatalError在父类中强制抛出错误,以保证开发者留意到必须在子类中实现方法该方法。

使用了fatalError关键字,即时函数有返回值编译器也能通过,只是会在不符合条件的情况下抛出fatal error异常。

最常见的例子:UIView指定的必须构造器init(coder: NSCoder),父类一厢情愿的指定其为required,而往往子类永远也不希望重写这个方法,我们可以在方法体中写上fatalError(“not supported”)来避免编译错误。


5、构造器的继承和重载。

OC中父类的构造器默认会被子类重载,这是一个不太好的机制。比如我定义一个DBView继承自UIView,并写了一个构造器initWithString,我希望所有的DBView对象都只通过这个构造器来创建,但OC还会允许init和initWithframe来创建对象。Swift则不同,子类不会默认继承父类的构造器(除非子类没有实现自己的构造器)。

如果有需求在子类中实现和父类相同的构造器,可以在子类中重载(override)父类的构造器,对于指定构造器和便利构造器的重载,情况还不大一样:

*假如重载的构造器是一个指定构造器,你可以在子类里重载其实现,并在自定义版本的构造器中调用父类版本的构造器。

*假如重载的是一个便利构造器,则重载过程必须通过调用同一类中提供的其它指定构造器来实现。

注意:

如果子类需要实现一个和父类完全相同的构造器时:

*若父类的构造器是一个指定构造器,则重载的构造器既可以是指定构造器,也可以是便利构造器,只是构造器前面都必须加override关键字。

*若父类构造器是一个便利构造器时,子类重写该构造器不需要加上override关键字,否则会报错。简单来说,类只有对指定构造器才有override的意义,对于便利构造器,不存在所谓的override。

关于构造器的继承:

Swift并非完全不允许子类继承父类的构造器,存在着这么写特殊情况:

*子类没有定义自己的构造器,默认集成父类的所有指定构造器。

*子类重写了所有父类的指定构造器,则会自动继承父类的所有便利构造器。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值