【问题标题】:Extension struct is not member on Swift扩展结构不是 Swift 的成员
【发布时间】:2017-05-26 00:24:01
【问题描述】:

创建了一个简单的扩展,允许我为 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
        }
    }
}

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

// SomeViewController.swift

extension UITableViewCell.Identifier {
    static let wololo = UITableViewCell.Identifier("wololo")   
}

但我收到以下错误:

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

现在事情变得更疯狂了: - 如果我在 UITableViewCellExtension.swift 上移动相同的扩展,它会编译并且一切正常。 - 如果我只是在 SomeViewController 的类主体上添加 static 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)
    }

    ...
}

应该是这样的语法:

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)
    }
}

【问题讨论】:

  • 更多的是关于语法,因为我已经修改了单元格的注册和出列方式,这样我就可以组织它的标识符,而无需每次都使用枚举和数字原始值。

标签: ios swift struct extension-methods


【解决方案1】:

我不确定,但这可能是 Xcode 错误。如果您创建 swift 文件模板,则在文件之外无法识别“标识符”结构。但是,如果您创建 Cocoa Touch 模板文件,则可以毫无问题地识别“标识符”结构。 templates

如果你创建了一个 swift 模板文件,你可以去构建阶段 -> 编译源 -> 删除文件并再次添加它。 希望对你有帮助。

compile sources

【讨论】:

  • 它确实有效,我将它作为开发者Apple的错误报告,感谢您的帮助。
  • 我必须在项目导航器中以正确的顺序放置文件。说明:如果 A 在其名为 A 的文件中声明,并且 A 的扩展名为 E (A.E) 在文件 B 中声明,则在项目导航器中,A 文件应出现在文件 B 之前。
  • 完美的解决方案和解释。奇怪的是我能够构建和运行应用程序。唯一的问题是来自 Xcode 的错误错误。删除/添加文件确实有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多