【问题标题】:Value of type 'Tags' has no member 'lastUsed'“标签”类型的值没有成员“lastUsed”
【发布时间】:2020-12-14 22:20:53
【问题描述】:

我在 Swift 中有一门课,Tags。

public class Tags {
    var lastUsed​: UInt64
    var frequency: Int
    var id: String
    var name​: String

    init(id: String = "", frequency: Int, lastUsed: UInt64, name: String) {
        self.id = id
        self.frequency = frequency
        self.lastUsed​ = lastUsed
        self.name​ = name
    }
}

我可以访问项目中某些类的字段,但有趣的是,我似乎无法访问某些类的某些字段。

违规字段是lastUsedname

当我运行 Find Selected Symbol in Workspace 时,我发现这些字段在某些引用它们的文件中可见,而在其他文件中不可见。

我实际上可以访问类中Tags类的其他字段。

我无法访问它的类具有以下定义:

import RealmSwift


 class StoredTags: Object{
    
    @objc dynamic var frequency: Int
    @objc dynamic var id: String
    @objc dynamic var lastUsed​: UInt64
    @objc dynamic var name​: String
    
    
    init(freq: Int,  id: String, lastUsed: UInt64, name: String){
        self.lastUsed​ = lastUsed
        self.name​ = name
        self.frequency = freq
        self.id = id
    }
    
    init(t: Tags){
        self.lastUsed​ = t.lastUsed. //Error-- Value of type 'Tags' has no member 'lastUsed'
        self.name​ = t.name​
        self.frequency = t.frequency
        self.id = t.id
        
    }
    class func getFromTags(t: Tags) -> StoredTags{
        let st = StoredTags()
        st.frequency = t.frequency
        st.id = t.id
        st.lastUsed​ = t.lastUsed//Error-- Value of type 'Tags' has no member 'lastUsed'
        st.name​ = t.name//Error-- Value of type 'Tags' has no member 'name'
        
        return st
        
    }
    
    required override init() {
        self.frequency = 0
        self.id = ""
        self.lastUsed​ = 0
        self.name​ = ""
    }
    
    
    
}

我怀疑这可能是 xcode 的问题;但我已经尝试了所有想到的。

请问这里可能是什么问题?

【问题讨论】:

    标签: swift xcode


    【解决方案1】:

    问题在于namelastUsed 的声明有一个不可见字符(U+200B = "ZERO WIDTH SPACE")作为标识符的最后一个字符。

    这是一个简短的例子,展示了似乎是一个悖论。第一个 print 语句不会编译,但最后一个可以:

    struct Tags {
        let name​ = "name"
    }
    
    print(Tags().name) // (1) Error: Value of type 'Foo' has no member 'name'
    print(Tags().name​) // (2) No error
    

    不幸的是,Xcode 不显示这个字符,即使打开了“Editor->Invisibles”。在vi 中打开文件会显示问题:

    struct Tags {
        let name<200b> = "name"
    }
    
    print(Tags().name) // (1) Error: Value of type 'Foo' has no member 'name'
    print(Tags().name<200b>) // (2) No error
    

    请注意,标识符名称中允许使用不可见字符,这已在 Swift forum 中讨论过。

    第一个打印语句是使用 Xcode 的代码完成创建的,Xcode 省略尾随的不可见字符。我会认为这是一个错误。

    第二个打印语句是通过仔细复制 name​ 标识符(包括尾随不可见字符)创建的。

    总结: Swift 标识符可以包含不可见字符,但这些字符不能很好地与 Xcode 的代码完成配合使用,只会引起混乱。重写所有这些标识符的出现可以解决问题。

    【讨论】:

    • 非常感谢!不幸的是,我们看不到隐形字符......但是他们现在不会隐形了,或者他们会吗?大声笑.... Apple 必须允许开发人员以一种或另一种方式查看隐形字符。周末我遇到了错误。
    【解决方案2】:

    我试用了您的代码并得到了相同的错误结果。即使我无法弄清楚为什么会显示错误,但如果您将名称更改为更具体的名称,例如 tagsLastUsed 和 tagsName 它可以正常工作。 我的猜测是 xcode 有点错误,并认为这些是保留字。 会发表评论,但我没有足够的积分,所以我发布作为答案

    【讨论】:

    • 您的结果是否相同?我觉得这应该是我的设置或 xcode 的某些问题
    • 是的,结果相同。我建议只对变量使用不同的词并将其删除。但是,如果您真的想深入了解,我将从您在上面声明的 @objc 动态变量开始
    • 嗯,不幸的是它是一个代码库,我可能不得不跳过箍来更改变量名称,因为我没有创建这部分代码.. 哈哈。我希望我能找出原因并解决。我过去 3 天左右一直在做这个,我不能再拖下去了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    • 2016-07-08
    • 1970-01-01
    • 2023-04-07
    • 2016-03-11
    • 1970-01-01
    相关资源
    最近更新 更多