初始化类的实例时,序列是什么?

时间:2017-02-09 19:40:29

标签: swift initialization constants

class Actor {
    let agent: String? = "nobody"

    init(agent: String){
        self.agent = agent // error: immutable value 'self.agent' may only be initialized once
    }
}

let John = Actor(agent: "xyz")

我对此处发生的序列感到困惑(我完全了解varlet之间的差异)。但为什么我会收到这个错误?

  • 如果我使用init方法,那么这并不意味着我没有使用 默认参数?
  • 为什么我不能用另一个更改默认常量?

1 个答案:

答案 0 :(得分:2)

您不能多次分配let变量 - 但是,您可以定义它并使其保持未初始化状态。然后,在"nobody"方法中,您可以将agent作为class Actor { let agent: String init(agent: String = "nobody"){ self.agent = agent } } print(Actor().agent) // "nobody" print(Actor(agent: "xyz").agent) // "xyz" 参数的默认值。

class Actor {
    let agent: String
    ...

    init() {
        self.agent = "nobody"
        ...
    }

    init(agent: String, ...){
        self.agent = agent
        ...
    }
}

正如亚历山大在下面的评论中所建议的那样,如果你的init方法中有太多的参数,默认值可能会有点混乱。考虑创建一个单独的init方法来设置默认值。

$(document).ready(function(){
    $('.opener').click(function(){
        function name(){
            if($('.bd').css('margin-left') == ($('body').width()*25)/100+'px'){
                $('.bd').css({
                    'animation':'expandbody 2s',
                    'margin-left':'0',
                    'width':'100%'
                });
                $('.menu').css({
                    'animation':'closemenu 1s',
                    'width':'0%',
                    'display':'none'
                });
            }else{
                $('.bd').css({
                    'animation':'smallerbody 2s',
                    'margin-left':'25%',
                    'width':'75%'
                });
                $('.menu').css({
                    'animation':'expandmenu 1s',
                    'width':'25%',
                    'display':'block'
                });
            }
        }
        name();
    });
});