ios - 如何重构 swift 代码以将协议(protocol)和结构类型作为方法参数

标签 ios swift

我有 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/

相关文章:

ios - 创建一个转换,当 View 被移除时,它的移除依赖于 @State 值

ios - 推送 UIViewController 的辅助方法

ios - 核心数据: Access linked entity attributes

ios - 在 didSelectRowAtIndexPath 中更改自定义 UIImage

swift - 如何使用 Swift 在后台线程中保存到 CoreData?

iphone - webView 中的简单视频和内存消耗

ios - 我可以使用UIWebView(iOS)自动登录youtube吗?

iphone - 相关实体的 iOS 核心数据持久化

ios - scrollView ContainerView 内的 Swift 3.0 UiTableView 未调用 DidSelectRow(Twitter 配置文件)

ios - 点击手势以使用 TableView 关闭 UITextField