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并非完全不允许子类继承父类的构造器,存在着这么写特殊情况:

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

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





内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值