Extension struct不是Swift的成员

Rod*_*ici 0 extension-methods struct ios swift

创建了一个简单的扩展,允许我给UITableViewCell一个标识符,所以我可以命名它,就像Apple使用Notification.Name一样:

// 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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在此之后,我们的想法是在UIViewController上添加这段代码,以便我可以组织我的单元格标识符:

// SomeViewController.swift

extension UITableViewCell.Identifier {
    static let wololo = UITableViewCell.Identifier("wololo")   
}
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:

'Identifier'不是'UITableViewCell'类型的成员

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

已经检查了扩展文件和viewController的Target Membership.


有关原因的更多解释

// UITableViewExtension.swift
extension UITableView {

    ...
    @available(iOS 6.0, *)
    open func dequeueReusableCell(withIdentifier identifier: UITableViewCell.Identifier, for indexPath: IndexPath) -> UITableViewCell {
        return dequeueReusableCell(withIdentifier: identifier.rawValue, for: indexPath)
    }

    @available(iOS 5.0, *)
    open func register(_ nib: UINib?, forCellReuseIdentifier identifier: UITableViewCell.Identifier) {
        register(nib, forCellReuseIdentifier: identifier.rawValue)
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

那应该是语法:

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 7

我不确定,但这可能是一个Xcode错误.如果创建swift文件模板,则无法在文件外识别"标识符"结构.但是如果你创建一个Cocoa Touch模板文件,那么'Identifier'结构就会被识别出来并没有问题. 模板

如果你创建一个swift模板文件,你可以去构建阶段 - >编译源代码 - >删除文件并再次添加它.希望它可以帮到你.

编译来源