Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 实例成员不能用于类型?_Swift - Fatal编程技术网

Swift 实例成员不能用于类型?

Swift 实例成员不能用于类型?,swift,Swift,我有以下课程: struct Console { static let formatter = DateFormatter() fileprivate var logger: ((_: String) -> Void)? public static func log(_ level: Slog_ClientLog.LogLevel,_ tag: String,_ message: String) { #if DEBUG if log

我有以下课程:

struct Console {
    static let formatter = DateFormatter()
    fileprivate var logger: ((_: String) -> Void)?

    public static func log(_ level: Slog_ClientLog.LogLevel,_ tag: String,_ message: String) {
        #if DEBUG
        if logger == nil {
            var output = ""
            switch level {
            case .verbose: output += "it should be;

public mutating func setPrivateLogger(imp: ((_: String) -> Void)?) {
    logger = imp
}
结构控制台{ 静态let格式化程序=日期格式化程序() fileprivate变量记录器:(((字符串)->Void)? 公共静态函数日志(u级别:Slog\u ClientLog.LogLevel,u标记:String,u消息:String){ #如果调试 如果记录器==nil{ var output=“” 开关电平{ case.verbose:output+=“应该是

struct Console {
static let formatter = DateFormatter()
private(set) var logger: ((_: String) -> Void)?

public static func log(_ level: Slog_ClientLog.LogLevel,_ tag: String,_ message: String) {
    // other code
 }

public mutating func setPrivateLogger(imp: ((_: String) -> Void)?) {
    logger = imp
 }
}
说明: struct是一种值类型。因此,当您更改它时,实际上会得到一个新值,就像Int、String或其他值类型一样。 因为它是一个值类型,所以您不能在它自己的实例中更改它。 “默认情况下,值类型的属性不能从其实例方法中修改”(Swift文档) 要做到这一点,你需要“变异”行为

  • 有关更多信息:
如果只想在Struct中设置“logger”,可以将其定义为“private(set)var logger”,或者如果只想在Struct中访问它,可以将其定义为“private var logger”


您正在访问类型化函数中的实例变量(此处为静态函数,如果它是类函数,则会出现相同的错误)。如果它是实例方法或变量是静态属性,则不会出现此错误

看看console类中的两个变量,formatter是一个静态属性(console.formatter),而logger是一个实例属性(将由console的实例访问,即console().formatter)

您需要检查控制台类的设计,并确定您需要什么

看看是否可以将记录器保持为静态变量


对于第二点,当您在类外声明它时,它是一个类型为(((u:String)->Void)的正则变量,并且不再是属性类控制台。

为什么fileprivate在这里不起作用?问题不在于fileprivate,而在于“static”funct。您应该将“static”替换为“mutating”“另外,您确定要将其设置为“fileprivate”而不是“private”吗?如果我将其设置为public而不是fileprivate,则可以。您也可以将其设置为“private”,但语法
(:String)
是旧版Swift 2代码。只需编写
(String)