问题描述
我有 viewcontroller
和常量属性如下。我想再次在我的 vc 中使用 tableViewRowHeight 以避免使用像 tableView.tableViewEsmimatedRowHeight = 100
final class ViewController: UIViewController {
// MARK: - Constants
private struct Constants {
static let tableViewRowHeight: CGFloat = 100
}
}
或
我应该创建一个名为 constant 的组文件夹吗?就安全性和清除我的 VC 而言,哪个是最佳解决方案?
解决方法
以您的示例为例,方法是:
class ViewController: UIViewController {
let tableViewRowHeight: CGFloat = 100
}
或
class ViewController: UIViewController {
var tableViewRowHeight: CGFloat { 100 }
}
哪个都行。
没有理由将其作为“常量”类型分开。没有必要让它成为静态的。
行高特定于表格视图。这不像当你改变一个表格的行高时,你想要改变你程序中的所有表格。所以你不会想把它拉出来。给它命名并把它放在你的特定 ViewController 的一个部分是很好的,这样你就可以很容易地找到它,但是创建一个名为“Constants”的类型并没有任何意义。
如果您确实想要改变整个系统的某些方面,该怎么办?可能是正文字体或突出显示颜色,如果您为一个视图更改,则您希望为所有视图更改。那么为此拥有一个类型可能是有意义的。但它仍然不会是像“常量”这样的模糊名称。在大多数情况下,最好通过在您想要的东西上添加扩展来做到这一点:
extension UIColor {
static var corporateHighlight: UIColor { .green }
}
这意味着当您使用它时,您可以将其称为 .corporateHighlight
。也就是说,我强烈建议您查看资产目录。
根据我的经验,以这种方式使用间距或高度是很少见的。但是,如果他们这样做了,创建一个覆盖 rowHeight
的 UITableView 子类通常更有意义,而不是在某处为其设置一个常量。这样你就可以命名 UITableView 以表明这些表在某种程度上是“相同的”。 (同样,为程序中的每个表设置单个行高是没有意义的。)
我有时也喜欢 Visal Rajapakse 的解决方案,将这些信息放在单元格而不是表格上。有时这行得通;有时不会。但它捕捉到了相同的想法,即拥有一种类型来表示具有一些共同点并且应该一起变化的单元格。
你永远不应该有一个名为“常量”的全局事物。这太宽泛了,会破坏代码重用。即使您最终确实需要一些东西来保存值,您也希望将其放入 Style 之类的东西中。有一个地方可以列出所有单元格填充以及所有网络超时值以及密码重试次数,这只是随机全局值的倾倒场。您很少希望将常量放在它们最常使用的类型之外。更罕见的是,您希望它们在该范围内具有全局性。
,表格视图
您可以创建 UITableViewCell
的子类。例如,
class RootTableViewCell: UITableViewCell {
// Get only height property
static var height: CGFloat {
return 100
}
}
并从 RootTableViewCell
继承到您想要高度为 100 的单元格,如下所示
class CustomCell: RootTableViewCell {
}
这将使所有从 height
子类化的单元格都可以访问 RootTableViewCell
。
通用常量
如果您在其他地方使用 height = 100
,最好的选择是创建一个 Constants
类并为您想要的每个功能嵌套 structs
。例如,
struct Constant {
struct Cells {
static let height: CGFloat = 100
}
}
这将是,
cell.frame.size.height = Constant.Cells.height
使用代码生成器
最后一个选择是使用代码生成器。一个流行的选项是 SwiftGen,当您为您的项目配置它时,它使事情变得更加容易。它会自动为你生成UIImages
、UIColor
、笔尖等所有常量