在XCode和Swift 2中构建一个编码良好的应用程序方面,我有一些关于什么是正确的和哪些错误的问题 .
Example: 可以在类中初始化视图和字段吗?
var name_field: UITextView?
var user_field: UITextView?
var email_field: UITextView?
var pass_field: UITextView?
然后在viewdidload()或func中自定义它们:
user_field = UITextView(frame: CGRectMake(20, sub_pad_1, fixed_width, fixed_height/2))
user_field!.textAlignment = NSTextAlignment.Center
user_field!.font = UIFont.systemFontOfSize(15)
user_field!.autocorrectionType = UITextAutocorrectionType.No
user_field!.keyboardType = UIKeyboardType.Default
user_field!.returnKeyType = UIReturnKeyType.Default
user_field!.delegate = self
我觉得感叹号和问号增加了内存泄漏的潜在风险,而且代码结构效率低下 . 有没有办法绕过它,因为我以这种方式定义变量的唯一原因是增加了在所有函数中访问类范围内对象的灵活性 .
2 回答
您实际上可以使属性隐式解包 .
这是你将能够使用这个属性没有!符号 .
请记住,如果此属性始终具有值!= nil,则隐式展开的选项只是一个很好的解决方案 . 如果某人在初始化之前尝试使用此属性,则结果将是运行时异常 . 这就是为什么我建议通过将其设为私有来限制其可见性 .
给出的例子都不是 initialization (又名 definition ) . 这些都是 declaration . 例如,
var name_field: UITextView?
声明“将存在名为name_field
的变量,类型为Optional(UITextView)
. 它不会初始化(或定义)它具有任何值 .在强制解包时(
!
),内存泄漏不是问题 . 当对象不存在更多引用时,如果对象在内存中存在,则会发生内存泄漏 . 它被's memory that can' t访问(因此,可以't serve any useful purpose), but isn' t释放 . 它与强制解包完全无关 .在这种情况下,根本没有理由让这些字段是可选的 . 这样的东西应该仍然可以工作,只要这些值都在初始化器中设置:
有一个更好的方法,更好地封装
UITextView
实例化:其他说明:
Swift约定是使用
camelCaseNames
,而不是snake_case_names
您无需显式声明枚举类型 . 编译器可以推断它 . 例如,
UIReturnKeyType.Default
可以只是.Default
如果您不需要不变性,请不要使用
var
. 尽可能偏爱let
.