我有 2 个有很多共同点的函数,我想重构我的代码以删除重复的逻辑,但是不同的是类型,特别是协议(protocol)和结构类型。我现在可以考虑的方式是,为了重构它,我将有 1 个通用方法将一种协议(protocol)类型作为参数,以及一种结构类型,其限制是结构类型必须实现协议(protocol)“DataDictionaryStore” .并将返回作为参数 1 传入的协议(protocol)类型的数组
我曾尝试使用泛型来实现这一点,但根据我的理解,在使用泛型时您仍然将实例作为参数传递,而不是实际类型本身。
我想在下面的代码中重构的方法是“articles()”和“authors()”
这是代码(可以复制到 playground Xcode 7+):
import Foundation
protocol Article {
var headline: NSString? { get }
}
protocol Author {
var firstName: NSString? { get }
}
protocol DataDictionaryStore {
init(dataDictionary: NSDictionary)
}
struct CollectionStruct {
let arrayOfModels: [NSDictionary]
//This function is identical to authors() except for return type [Article], and 'ArticleStruct'
func articles() -> [Article] {
var articlesArray = [Article]()
for articleDict in arrayOfModels {
let articleStruct = ArticleStruct(dataDictionary: articleDict)
articlesArray.append(articleStruct)
}
return articlesArray
}
func authors() -> [Author] {
var authorsArray = [Author]()
for authorDict in arrayOfModels {
let authorStruct = AuthorStruct(dataDictionary: authorDict)
authorsArray.append(authorStruct)
}
return authorsArray
}
}
struct ArticleStruct : Article, DataDictionaryStore {
var internalDataDictionary: NSDictionary
init(dataDictionary: NSDictionary) {
internalDataDictionary = dataDictionary
}
var headline: NSString? { return (internalDataDictionary["headline"] as? NSString) }
}
struct AuthorStruct : Author, DataDictionaryStore {
var internalDataDictionary: NSDictionary
init(dataDictionary: NSDictionary) {
internalDataDictionary = dataDictionary
}
var firstName: NSString? { return (internalDataDictionary["firstName"] as? NSString) }
}
var collStruct = CollectionStruct(arrayOfModels: [NSDictionary(objects: ["object1", "object2"], forKeys: ["key1", "headline"])])
print(collStruct)
var articles = collStruct.articles()
print(articles)
for article in articles {
print(article.headline)
}
如果有另一种方法来重构它以删除重复的逻辑,欢迎所有建议。
最佳答案
这不完全是您问题的答案,但这可能足以让您满意地简化它:
func articles() -> [Article] {
return arrayOfModels.map(ArticleStruct.init)
}
func authors() -> [Author] {
return arrayOfModels.map(AuthorStruct.init)
}
关于ios - 如何重构 swift 代码以将协议(protocol)和结构类型作为方法参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36184463/