关于在方法内声明常量创建UILabel的简易方案的安全性及潜在弊端咨询
你的Label创建方法:能运行,但有不少潜在问题
嘿,这个方法目前能正常运行,但从代码健壮性、可维护性和扩展性来看,确实存在不少值得注意的问题,咱们一步步拆解:
一、安全层面:暂时没崩溃,但有隐性风险
- 你直接调用
UIScrollView.addSubview(labelName),这里的UIScrollView应该是某个全局实例吧?如果这个全局实例还未初始化(比如在viewDidLoad之前调用这个方法),或者被意外置为nil,那这行代码会直接触发崩溃。 - 方法参数里的
labelName完全被内部的let labelName = UILabel(...)覆盖了,这虽然不会导致崩溃,但属于完全没必要的冗余代码,会让其他看代码的人困惑——参数名和局部变量名一模一样,根本看不出参数的实际作用(实际上这个参数完全没用)。
二、核心弊端:复用性、灵活性极差
这才是更严重的问题,会让你后续扩展功能时非常痛苦:
- 名不副实+可读性差:方法名是
textSettings,但实际是在创建并添加一个UILabel,完全名不副实;再加局部变量和参数同名的问题,别人看你的代码第一反应会是“这参数到底干嘛用的?”。 - 耦合死了父视图:你硬编码了只能往这个全局的
UIScrollView加Label,以后要给普通UIView、UITableViewCell或者其他容器加Label,这个方法完全用不了,复用性为0。 - 固定属性太多,灵活性缺失:你强制设置了
textAlignment = .center、初始frame高度固定21,还直接调用sizeToFit()——如果需要左对齐的Label、需要固定宽度换行的Label,这个方法都满足不了,只能重新写一个类似的方法,代码重复率极高。 - 无法后续控制Label:你创建的Label被添加到ScrollView后,外部没有任何引用能拿到它。如果以后需要修改Label的文本、隐藏它、调整位置,只能遍历ScrollView的
subviews去找,非常麻烦,还容易出错。 - 违背单一职责原则:把“创建Label、配置属性、添加到父视图”全塞到一个方法里,不符合iOS开发的代码规范,也不利于后续的调试和修改。
三、改进建议:让代码更灵活、易维护
我给你重构一下这个方法,解决上面的所有问题:
func createAndAddLabel(to parentView: UIView, text: String, textColor: UIColor, fontSize: CGFloat, centerPosition: CGPoint, textAlignment: NSTextAlignment = .center) -> UILabel { // 初始化Label,初始frame可以更灵活,或者干脆用autolayout let newLabel = UILabel(frame: CGRect(x: 0, y: 0, width: 0, height: 21)) // 配置属性,可选参数给默认值,需要修改时可以传参 newLabel.textAlignment = textAlignment newLabel.text = text newLabel.textColor = textColor newLabel.font = newLabel.font.withSize(fontSize) newLabel.sizeToFit() // 设置位置,用center比layer.position更符合UIKit的常规写法 newLabel.center = centerPosition // 传入父视图,不再硬编码 parentView.addSubview(newLabel) // 返回Label实例,方便外部后续控制 return newLabel }
这样修改后:
- 方法名清晰明确,一看就知道是创建并添加Label;
- 父视图作为参数传入,适配任何UI容器;
- 固定属性做成可选参数,默认值保留你常用的
.center,需要修改时可以灵活传参; - 返回Label实例,外部可以持有引用,后续修改、删除都很方便;
- 去掉了无用的参数,代码可读性大幅提升。
总结
你的原始方法短期小范围使用没问题,但如果是长期维护的项目,或者需要扩展功能,建议尽快重构。上面的改进版代码更符合iOS开发的最佳实践,也能帮你避免后续很多不必要的麻烦。
内容的提问来源于stack exchange,提问作者Sergey_VC
相关产品推荐
相关产品推荐

