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)