【问题标题】:Static var being treated as let constant?静态变量被视为让常量?
【发布时间】:2017-05-13 15:21:27
【问题描述】:

我有一个包含 3 个静态变量的结构 (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' 常量

到目前为止,这就是我的代码中的全部内容,我不明白为什么静态变量会被视为常量。这是特定于初始化程序的吗?

【问题讨论】:

    标签: swift static-variables


    【解决方案1】:

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

    【讨论】:

    • 非常感谢。由于错误,我按照我的方式订购了参数。我想看看它是否总是会在第一个参数上抛出错误,或者它是否特定于 someUrlStart。另外,我打算将它们保留为静态变量。非常感谢你提醒我去掉参数
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-14
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多