静态var被视为常量?

时间:2017-05-13 15:21:27

标签: swift static-variables

我有一个包含3个静态变量的struct(someUrl):

struct someUrl {
    static var keywords = String()
    static var someUrlStart = String()
    static var someUrlEnd = String()
}

和类(url),其变量类型为someUrl:

class Url {
    var someUrlConstructor: someUrl

    init(keywords: String, someUrlEnd: String, someUrlStart: String) {
        self.someUrlConstructor = someUrl(someUrlStart = someUrlStart, keywords = keywords, someUrlEnd = someUrlEnd)
    }

}

在尝试初始化类中的变量时,Xcode抛出一个错误,指出someUrlStart是一个let常量。

  

无法赋值:'someUrlStart'是'let'常量

到目前为止,这是我在代码中所拥有的全部内容,并且我不明白为什么静态var将被视为常量。这是否特定于初始化器?

2 个答案:

答案 0 :(得分:5)

你在这里混淆了编译器。首先你的语法在传递参数方面是错误的,它应该是<div id="video"> <iframe width="100%" height="100%" src="https://www.youtube.com/embed/zWAiQJvwb8Q?autoplay=1&loop=1&controls=0&rel=0&showinfo=0&playlist=zWAiQJvwb8Q&modestbranding=1" frameborder="0" allowfullscreen="allowfullscreen"></iframe> </div> #video { height:100%; width:100% !important; background-size:100% 100%; position:relative; overflow:hidden; } 而不是:,那么你应该删除=并改变参数的顺序:

static

或者,如果你想让它们保持静态,那么完全删除参数,因为它们现在是静态变量,而不是成员/实例变量:

struct someUrl {
    var keywords = String()
    var someUrlStart = String()
    var someUrlEnd = String()
}

class Url {
    var someUrlConstructor: someUrl

    init(keywords: String, someUrlEnd: String, someUrlStart: String) {
        self.someUrlConstructor = someUrl(keywords: keywords, someUrlStart: someUrlStart, someUrlEnd: someUrlEnd)
    }
}

编译器认为你在​​做什么(或者基本上你正在编写struct someUrl { static var keywords = String() static var someUrlStart = String() static var someUrlEnd = String() } class Url { var someUrlConstructor: someUrl init(keywords: String, someUrlEnd: String, someUrlStart: String) { self.someUrlConstructor = someUrl() } } 的内容)试图改变你作为初始化参数给出的=(以及其他两个)实际上是一个常数。

除了错误的语法之外,我没有看到someUrlEndstatic的使用,只需使用class Url,它的默认初始值设定项并从那里开始。一般说明:请大写结构的第一个字母:struct someUrl

答案 1 :(得分:1)

static变量属于struct本身,而不属于实例。因此,您无法通过实例使用点表示法来访问它们。

不确定你想做什么,但这在技术上会起作用:

struct SomeUrl {
    static var keywords = String()
    static var someUrlStart = String()
    static var someUrlEnd = String()
}

class Url {
    let someUrlConstructor = SomeUrl()

    init(keywords: String, someUrlEnd: String, someUrlStart: String) {
        SomeUrl.keywords = keywords
        SomeUrl.someUrlStart = someUrlStart
        SomeUrl.someUrlEnd = someUrlEnd
    }
}