首页 文章

效率和Swift编码礼仪[关闭]

提问于
浏览
0

在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 回答

  • 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,则隐式展开的选项只是一个很好的解决方案 . 如果某人在初始化之前尝试使用此属性,则结果将是运行时异常 . 这就是为什么我建议通过将其设为私有来限制其可见性 .

  • 0

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

    给出的例子都不是 initialization (又名 definition ) . 这些都是 declaration . 例如, var name_field: UITextView? 声明“将存在名为 name_field 的变量,类型为 Optional(UITextView) . 它不会初始化(或定义)它具有任何值 .

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

    在强制解包时( ! ),内存泄漏不是问题 . 当对象不存在更多引用时,如果对象在内存中存在,则会发生内存泄漏 . 它被's memory that can' t访问(因此,可以't serve any useful purpose), but isn' t释放 . 它与强制解包完全无关 .

    在这种情况下,根本没有理由让这些字段是可选的 . 这样的东西应该仍然可以工作,只要这些值都在初始化器中设置:

    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 .

相关问题