私は共通点が多い2つの関数がありますが、繰り返し論理を取り除くためにコードを再作成したいのですが、型、具体的にはプロトコル、および構造体型があります。私が考えることができる方法は、これを再因子化することです。これは、引数として1つのプロトコルタイプを取る1つの一般的なメソッドと、構造体タイプがプロトコル 'DataDictionaryStore'を実装しなければならないという制限。そして、引数1として渡されたプロトコルタイプの配列を返します。メソッドの引数としてプロトコルと構造体の型を取るためにスウィフトコードをリファクタリングする方法
これをジェネリックで実装しようとしましたが、理解していても、実際のものではなくジェネリックを使用するときに引数としてインスタンスを渡します。それ自体を入力します。私は以下のコードで再ファクタしたいと思います
方法は「記事()」、および「作者()」
です。ここ(遊び場の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)
}
繰り返し論理を削除するには、これを再要因する別の方法がある場合は、すべての提案を歓迎します。
...このようにそれを呼び出すことができます
、私はマップは、このように使用することができることを知りませんでした。実際には、NSDictionaryをとる「init」関数が必要です。実際に構造体がどのように実装されているかは、構造体の作成と実際には分離されています。 – Mike