我想知道扩展类和简单类与符合协议之间的确切区别(可读性除外)
假设我创建了具有类似
的tableview方法的类extension DemoVC:UITableViewDelegate,UITableViewDataSource
{
//MARK: -
//MARK: - UITableview delegate
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
return 0
}
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
....
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
{
}
}
而不是如果我创建相同的类扩展以符合tableView方法,如
(except READABILITY)
那么哪个更好,为什么 extension Double {
var mm: Double { return self / 1_000.0 }
}
let oneInch = 25.4.mm
print("One inch is \(oneInch) meters")
第二个例子 随着双倍的延伸是好的
let oneInch = 25.4. / 1000
或
{{1}}
所以这里我的问题哪个更好地使用双重OR的扩展我有简单的双倍乘以1000(如果我只需要特定的类)和为什么??
答案 0 :(得分:1)
扩展类似于Objective-C中的类别。 (与Objective-C类别不同,Swift扩展没有名称。)
扩展可以扩展现有类型,使其采用一个或多个协议。要添加协议一致性,请按照为类或结构编写协议名称的方式编写协议名称
extension someClassName: OneProtocol, AnotherProtocol {
// implementation of protocol requirements goes here
}
答案 1 :(得分:0)
其可读性和访问权限。如果您在同一个类中具有一致性并将其归档,则实现对类的其他变量和函数具有不同的访问级别,而如果在不同的文件中定义,则它将具有不同的访问级别。
答案 2 :(得分:0)
关于Swift 3,当您使用扩展时,您无法访问扩展类中的私有方法和结构。因此,如果您的数据模型是私有的,则无法通过扩展程序访问它,如果您正在实施表格查看方法,则很可能会这样做。
关于Swift 4,唯一一次绝对必要的扩展是当你无法访问你正在扩展的类的源时。在Swift 4中,私有数据可以通过同一文件中定义的扩展来访问,在这种情况下,任何一种方式都可以工作。
遵循一个好的经验法则:如果您有权访问类源并允许修改它,那么只需直接在类中遵循协议即可。如果您没有源,或者您不允许修改源,那么您将需要使用扩展名。
除此之外,唯一的主要区别在于可读性,正如您已经提到的那样,所以它归结为风格问题,等待您的设计不需要访问私人数据。
答案 3 :(得分:0)
在extension
下面,我们使用的是继承概念。
extension DemoVC:UITableViewDelegate,UITableViewDataSource
{
//MARK: -
//MARK: - UITableview delegate
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
return 0
}
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
....
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
{
}
}
以下extension
是一个类中添加的更多功能。
extension Double {
var mm: Double { return self / 1_000.0 }
}
let oneInch = 25.4.mm
print("One inch is \(oneInch) meters")
同样extension Double {}
我们可以在项目中的任何类中使用。意味着我们必须调用类似let oneInch = 25.4.mm
的方法。