最近,我学习了Swift和开发iOS应用程序的基础知识。现在,我想自己开发一个真正的应用程序,但我非常关心编写好的代码,所以我已经寻找“最佳实践”,“设计模式”和“正确的方式”来实现它。

在我的搜索中,我发现这个great tutorial关于Swift iOS应用程序中通常使用的所有设计模式,以及他们使用的示例。

但是,尽管如此,我认为这个教程是一个伟大的,并帮助了我很多,但我觉得这只是一个开始,因为我看到很多S.O.L.I.D.违反原则例如:

参见LibraryAPI中实现的外墙图案:

class LibraryAPI: NSObject {

    private let persistencyManager: PersistencyManager
    private let httpClient: HTTPClient
    private let isOnline: Bool

    class var sharedInstance: LibraryAPI {

        struct Singleton {
            static let instance = LibraryAPI()
        }

        return Singleton.instance
    }

    override init() {
        persistencyManager = PersistencyManager()
        httpClient = HTTPClient()
        isOnline = false

        super.init()
        NSNotificationCenter.defaultCenter().addobserver(self,selector:"downloadImage:",name: "BLDownloadImageNotification",object: nil)
    }

    deinit {
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }

    func getAlbums() -> [Album] {
        // ... Not relevant
    }

    func addAlbum(album: Album,index: Int) {
        // ... Not relevant
    }

    func deletealbum(index: Int) {
        // ... Not relevant
    }

    func downloadImage(notification: NSNotification) {
        // ... Not relevant
    }
}

我想到的第一件事就是:这是不是违反了方方反叛原则?不应该将httpClient和persistencyManager声明为协议,然后HttpClient和PersistencyManager类实现该协议?

如果是这种情况,在某些时候,我将必须定义什么类,实现这些协议,我将要使用。我应该在哪里告诉应用程序?

我还有一个问题是:这个例子只实现了一个Model(Album),但是如果它会实现很多其他的呢? (专辑,作者,类型…)。 LibraryAPI不会如此大,以致违反单一责任原则?

最后但并非最不重要的一点:在PersistencyManager中存在DIP的相同问题。不应该实现DAO模式,所以`PersistencyManager不依赖于其他类?

谢谢你提前,我希望我自己解释够好!

几点建议

>设计模式是帮助您节省解决已解决问题的方法的指南,它们不是严格的规则
>虽然你链接到的网站(raywenderlich.com)是一个很好的开始,为教程,更详细的看看设计模式在swift我建议Design Patterns In Swift
>如果HttpClient和PersistencyManager是提供接口的基类,而不是一个协议不是必需的。我同意协议是一个更通用的方法
>如果您使用协议,我会在初始化程序中指定客户端和持久性管理器,因为它们是必需的
>持久化模型是一个特定的足够角色,由单个类来处理,请参见realm.io的示例数据库

开发Swift iOS应用程序“正确的方式”的更多相关文章

  1. ios – 使用MonoTouch,HttpClient和Charles Proxy时的HTTP流量监控问题

    我是HttpClient类的新手,我遇到了使用CharlesProxy监视请求的问题.基本上我需要的是监视从模拟器或实际iOS设备发出的请求.Here您可以找到有关如何配置CharlesforiOS开发的精彩教程.我正在制作简单的HttpClient请求,只是一个简单的授权代码有效,用户正在被授权,并且正在返回承载令牌.但是问题是,我在模拟器上的请求没有出现在Charleshttp流量监控列表中.

  2. 可以在Mavericks(OS X 10.9)上使用XCode 5为iOS 6开发吗?

    这个问题已经过时了.小牛队发布,一切正常,在iPod4th上使用Xcode5和iOS6.我正在考虑将我的OSX升级到Mavericks,但我仍然想继续开发我的iOS应用程序.我在网上看到Xcode4.6.3与Mavericks不兼容.所以,这会迫使我使用新的Xcode5.然而,Xcode5附带了新的iOS7SDK.问题是我拥有一个与iOS7不兼容的iPod第四代.那么,有人试过这个吗?

  3. ios – 从iphone app store过渡到企业开发

    它应该覆盖手机上的相同应用程序,而不是创建第二个应用程序.我联系了Apple支持,他们说:“不,如果你没有指示客户卸载他们的旧应用程序,你将安装2个应用程序”.这是真的?

  4. ios – Marmalade SDK是否与游戏开发更相关或更常用?

    我是移动应用程序开发的新手,并且正在寻找一个适合的平台.我遇到了一个项目,人们希望将交换机和家庭自动化公司的自助广告实施到移动应用程序中.他们最初想要一个iPhone应用程序,但也希望随后在Android和其他平台上部署.一个类似的应用程序是这one.在投入大量时间研究各种SDK和开发人员计划之后,Marmalade通过它的多平台部署功能引起了我的注意.然而,在经历了一些教程之后,我发现these

  5. ios – 尝试在设备上运行我的应用程序时找不到此可执行文件的有效配置文件

    我正在敲打我的头一天超过一天,我几天前将应用程序上传到苹果商店,它被拒绝了.我做了更改,现在想再次在我的手机上测试应用程序,每次我都收到一条奇怪的消息,告诉我没有有效的配置文件.我是iOS的新手.我检查了各种问题,并按照解释设置了所有内容.为什么这个奇怪的错误.点击窗口>组织者我看到我的有效个人资料和我的iPhone带有绿色信号.我想知道问题出在哪里!

  6. iOS7 Safari中的全屏模式

    我正在使用SenchaTouch开发移动网站.在iOS7Safari中,我无法创建顶级地址栏和下面的工具栏消失了.Sencha过去常常处理iOS6,但iOS7最近的一些变化导致了这个问题.http://java.dzone.com/articles/safari-ios-7-and-html5我阅读了上面的链接&对于HTML5游戏而言,这似乎也是一个问题.一些其他应用程序.适用于iOS6的旧win

  7. 调试 – iOS设备上的remote console.log()

    我正在开发涉及touchEvent的网络应用程序.如果我可以在我的Mac上远程查看控制台,那么调试它会更容易一些.我可以在iOS设备上使我的MobileSafari将控制台日志存储在系统中的某个位置.我已经越狱了我的iPad.谢谢!

  8. ios – iPhone:我可以通过编程方式禁用自动关闭显示屏吗?

    3个我最近开始在Objective-C开发iPhone应用程序,并组装了一个小型通用视频播放器,可以让我在iPhone上观看电视节目,电影等.除了一件小事之外,一切都在完美无缺.如果我在该时间范围内没有点击屏幕,显示屏会在一两分钟后关闭并变为黑色.我想知道在我的应用程序打开时是否可以以编程方式保持显示.我已经尝试将idleTimerdisabled设置为true,但没有成功.我的设备是越狱的,如果它有所作为,我也开放的解决方案只适用于越狱设备.解决方法在AppDelegate中添加:

  9. 使用iOS 9 beta 3时,一般设置中没有配置文件选项卡

    当我尝试运行我的应用程序在iOS9beta3,以及beta4&5,我收到一个错误说不信任的企业开发人员UntrustedEnterpriseDeveloper“iPhoneDeveloper:name(id)”hasnotyetbeentrustedonthisiPhone.Untilthisdeveloperhasbeentrusted,theirenterpriseappswillnotbea

  10. ios – 警报“开发人员工具访问需要控制另一个进程进行调试以继续.输入您的密码以允许这一点.

    编辑那些你厌恶命令行的人可以在组织者窗口中找到类似的功能在XCode中打开“管理器”窗口,在“设备”选项卡中,您将看到列出的“我的Mac”.您可以通过点击按钮来启用和禁用开发人员模式.

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部