Ios 扩展结构不是Swift上的成员

Ios 扩展结构不是Swift上的成员,ios,swift,struct,extension-methods,Ios,Swift,Struct,Extension Methods,创建了一个简单的扩展,允许我为UITableViewCell指定一个标识符,这样我就可以命名它,就像Apple在通知方面所做的那样。名称: // UITableViewCellExtension.swift extension UITableViewCell { public struct Identifier: RawRepresentable { public typealias RawValue = String public var rawVa

创建了一个简单的扩展,允许我为UITableViewCell指定一个标识符,这样我就可以命名它,就像Apple在通知方面所做的那样。名称:

// UITableViewCellExtension.swift

extension UITableViewCell {
    public struct Identifier: RawRepresentable {
        public typealias RawValue = String

        public var rawValue: RawValue {
            return self._rawValue
        }

        private var _rawValue: RawValue

        public init(rawValue: RawValue) {
            self._rawValue = rawValue
        }

        public init(_ rawValue: RawValue) {
            self._rawValue = rawValue
        }
    }
}
在此之后,我的想法是在UIViewController上添加这段代码,这样我就可以组织我的单元格标识符:

// SomeViewController.swift

extension UITableViewCell.Identifier {
    static let wololo = UITableViewCell.Identifier("wololo")   
}
但我得到了以下错误:

“标识符”不是“UITableViewCell”类型的成员

现在事情变得更疯狂了: -如果我在UITableViewCellExtension.swift上移动相同的扩展名,它会编译,一切正常。 -如果我只是在SomeViewController的类主体上添加静态let wololo=UITableViewCell.Identifier(“wololo”),它就可以工作了

已检查扩展文件和viewController的目标成员身份


再解释一下原因

这应该是语法:

class PlacesViewController: UIViewController, UITableViewDataSource {
    let tableView = UITableView()

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.register(UINib(), forCellReuseIdentifier: .wololo)
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        return tableView.dequeueReusableHeaderFooterView(withIdentifier: .wololo)
    }
}

我不确定,但这可能是一个Xcode错误。如果创建swift文件模板,“标识符”结构在文件外部无法识别。但是,如果您创建一个Cocoa Touch模板文件,“Identifier”结构将被识别,不会出现任何问题。

如果您创建了一个swift模板文件,您可以进入构建阶段->编译源代码->删除该文件并再次添加它。 希望它能帮助你


更多的是关于语法,因为我修改了单元格的注册和排队方式,这样我就可以组织其标识符,而不必每次都使用枚举和数字原始值。它确实有效,我将在开发者Apple上报告它是一个bug,感谢您的帮助。我必须在Project Navigator中按正确的顺序放置文件。说明:如果在名为A的文件中声明了A,并且在文件B中声明了名为E(A.E)的扩展名,那么在项目导航器中,A文件应该出现在文件B之前。完美的解决方案和说明。奇怪的是,我能够构建并运行这个应用程序。唯一的问题是Xcode错误。删除/添加文件确实有效。
class PlacesViewController: UIViewController, UITableViewDataSource {
    let tableView = UITableView()

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.register(UINib(), forCellReuseIdentifier: .wololo)
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        return tableView.dequeueReusableHeaderFooterView(withIdentifier: .wololo)
    }
}