静态变量被视为 let 常量?

Static var being treated as let constant?

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

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

和一个 class (Url) 和一个类型为 someUrl 的变量:

class Url {
    var someUrlConstructor: someUrl

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

}

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

cannot assign to value: 'someUrlStart' is a 'let' constant

到目前为止我的代码中只有这些,我不明白为什么静态变量会被视为常量。这是特定于初始化器的吗?

你在这里混淆了编译器。首先你的语法在传递参数方面是错误的,它应该是 : 而不是 =,然后你应该删除 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()
    }
}

编译器认为你在​​做什么(或者基本上你在写 = 时实际上在做什么)是试图改变 someUrlEnd (和其他两个)你作为初始值设定项参数实际上是一个常数。


除了错误的语法,我没有看到 staticclass Url 的用途,只需使用 struct someUrl,它的默认初始化程序并从那里开始。一般注意事项:请大写结构的第一个字母:SomeUrl.

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
    }
}