扩展结构不是 Swift 的成员
Extension struct is not member on 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
}
}
}
在此之后,我的想法是将这段代码添加到 UIViewController 上,这样我就可以组织我的单元格标识符:
// SomeViewController.swift
extension UITableViewCell.Identifier {
static let wololo = UITableViewCell.Identifier("wololo")
}
但是我得到了以下错误:
'Identifier' is not a member of type 'UITableViewCell'
现在事情变得有点疯狂了:
- 如果我在 UITableViewCellExtension.swift 上移动相同的扩展名,它会编译并且一切正常。
- 如果我只是在 SomeViewController 的 class 主体上添加 static let wololo = UITableViewCell.Identifier("wololo"),它就可以工作。
已经检查了扩展文件的目标成员资格和viewController。
关于原因的更多解释?
// 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)
}
}
我不确定,但这可能是一个 Xcode 错误。如果您创建 swift 文件模板,则 'Identifier' 结构在文件外部无法识别。但是,如果您创建 Cocoa Touch 模板文件,则 'Identifier' 结构可以毫无问题地被识别。
templates
如果您创建了一个 swift 模板文件,您可以转到构建阶段 -> 编译源代码 -> 删除文件并重新添加。
希望对你有帮助。
compile sources
创建了一个简单的扩展,允许我为 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")
}
但是我得到了以下错误:
'Identifier' is not a member of type 'UITableViewCell'
现在事情变得有点疯狂了: - 如果我在 UITableViewCellExtension.swift 上移动相同的扩展名,它会编译并且一切正常。 - 如果我只是在 SomeViewController 的 class 主体上添加 static let wololo = UITableViewCell.Identifier("wololo"),它就可以工作。
已经检查了扩展文件的目标成员资格和viewController。
关于原因的更多解释?
// 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)
}
}
我不确定,但这可能是一个 Xcode 错误。如果您创建 swift 文件模板,则 'Identifier' 结构在文件外部无法识别。但是,如果您创建 Cocoa Touch 模板文件,则 'Identifier' 结构可以毫无问题地被识别。 templates
如果您创建了一个 swift 模板文件,您可以转到构建阶段 -> 编译源代码 -> 删除文件并重新添加。 希望对你有帮助。
compile sources