效率和Swift编码礼仪

时间:2016-06-27 16:25:57

标签: ios xcode swift

关于在XCode和Swift 2中构建编码良好的应用程序的问题,我有一些问题是正确的,哪些是错的。

示例: 是否可以在类中初始化视图和字段?

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 个答案:

答案 0 :(得分:0)

您实际上可以隐藏地展开属性选项。

var name_field: UITextView!

这是你可以使用这个属性没有!符号

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)
...

请记住,如果此属性始终具有值!= nil,则隐式展开的选项只是一个很好的解决方案。如果某人在初始化之前尝试使用此属性,则结果将是运行时异常。这就是为什么我建议通过将其隐私来限制其可见性。

答案 1 :(得分:0)

  

示例:在类中初始化视图和字段是否可以?

所给出的示例都不是初始化(又名定义)。这些都是声明。例如,var name_field: UITextView?声明"将存在名为name_field的变量,类型为Optional(UITextView)。它没有初始化(或定义)它具有任何值。

  

我觉得感叹号和问号增加了内存泄漏的潜在风险,而且代码结构效率低下。

强制解包时,内存泄漏不是问题(!)。当对象不存在更多引用时,如果对象在内存中存在,则会发生内存泄漏。它的记忆无法被访问(因此,不能用于任何有用的目的),但是没有被释放。这与强行打开完全无关。

在这种情况下,根本没有理由让这些字段成为可选字段。只要这些值都在初始化程序中设置,这样的东西仍然有效:

struct Example {

    var name_field: UITextView
    var user_field: UITextView
    var email_field: UITextView
    var pass_field: UITextView

    init() {
        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

        name_field = something
        email_field= something
        pass_field= something
    }
}

有一种更好的方法,可以更好地封装UITextView实例化:

struct Example {

    var name_field: UITextView
    var user_field: UITextView
    var email_field: UITextView
    var pass_field: UITextView

    init() {
        user_field = {
            let uitv = (frame: CGRectMake(20, sub_pad_1, fixed_width, fixed_height/2))
            uitv.textAlignment = .Center
            uitv.font = UIFont.systemFontOfSize(15)
            uitv.autocorrectionType = .No
            uitv.keyboardType = .Default
            uitv.returnKeyType = .Default
            uitv.delegate = self

            return uitv
        }()

        name_field = something
        email_field= something
        pass_field= something
    }
}

其他说明:

  • Swift惯例是使用camelCaseNames,而不是snake_case_names

  • 您不需要明确说明枚举类型。编译器可以推断它。例如,UIReturnKeyType.Default可以只是.Default

  • 如果您不需要不变性,请不要使用var

  • 尽可能支持let