• 使用swift开发OSX应用

    2016-01-03 18:33:49
    原文:http://www.raywenderlich.com/87002/getting-started-with-os-x-and-swift-tutorial-part-1 翻译原文:http://blog.csdn.net/kmyhy/article/details/45150649 打开Xcode,使用 File\NewProject… 菜单...

    原文:http://www.raywenderlich.com/87002/getting-started-with-os-x-and-swift-tutorial-part-1

    翻译原文:http://blog.csdn.net/kmyhy/article/details/45150649


    打开Xcode,使用 File\NewProject… 菜单,在弹出窗口中选择 “OS X/Application”,然后Next。


    在接下来的窗口中,配置App信息。在product name栏中输入ScaryBugsMac,输入你的机构名以及机构ID。剩余字段保留为空白。

    选择Swift作为开发语言,保持所有选项框反选,document extension栏保留为空白。然后点Next。


    然后Xcode会要求你选择项目保存路径。选择一个物理路径,然后点击Create。

    项目就创建完了,这是一个单窗口App。点击工具栏左上角的Run按钮,运行这个程序,效果如下图所示。


    首先我们来总结一下。我们使用Xcode模板创建了一个Mac App项目,然后编译运行了这个空白项目。与iOS开发的最大不同在于:

    ·      窗口不需要特别指明大小,比如iPhone或iPad屏幕大小——MacApp的窗口是可以通过拖动来改变大小的。

    ·      Map App可以拥有多个窗口,窗口支持最小化,重排等操作。

    然后我们来新建一个View Controller,并在它上面放入App的主界面。使用

     File\New\File… 菜单,在弹出窗口中,选择 OS X\Source\Cocoa Class,然后点Next。


    类名填入 MasterViewController, “Subclass of”填入NSViewController。确保“Also create XIB file for user interface” 为勾选,然后点Next。


    在最后一个弹出窗口中,点击Create。新的View Controller将显示在项目导航窗口中:


    打开MasterViewController.xib。需要注意的是,在Mac App中,有大量的类和iOS中都类似,只不过是以NS前缀命名。例如NSScrollView、NSLabel、NSButton等。

    在右下角的UI Controls面板(位于第三个Tab)中,选中NSTableView将它拖到MasterViewController.xib的画布中。


    不要担心Table View的大小,我们待会会来处理它。


    打开 AppDelegate.swif在window属性下面插入如下语句:

    var masterViewController: MasterViewController!

     

    找到 applicationDidFinishLaunching 方法,这个方法在App启动时调用。

    注意: 这个方法等同于iOS中的application(_:didFinishLaunchingWithOptions:)方法。

    applicationDidFinishLaunching方法内,加入以下语句:

    masterViewController = MasterViewController(nibName:"MasterViewController", bundle: nil)

    window.contentView.addSubview(masterViewController.view)

    masterViewController.view.frame = (window.contentView asNSView).bounds

     

    在 OS X中,窗口(NSWindow对象)总是有一个默认的View,即contentView。它自动占据整个窗口的大小。当我们想在窗口中使用自己的视图时,需要用addSubview方法将它添加到contentView的subviews中。

    在iOS开发中,我们可以设置将一个View Controller直接设置为窗口的rootViewController属性,但在OS X中你只能将视图添加到contentView的subviews,因为OS X中没有rootViewController的概念。

    运行App,你将看到如下画面:


    数据模型

    接下来创建数据模型。

    首先我们来熟悉一下Xcode项目文件的组织结构:


    默认模板会创建一个以项目名称为名的文件夹。在这个文件夹下有一个supporting files的子文件夹,其中存放plist和资源文件。当项目很大时,会创建大量的文件,查找文件就会变得很困难。因此我们需要有一个良好的项目文件组织形式。

    首先,我们新建一个文件夹(group),命名为GUI。在ScaryBugsMac文件夹上点击右键,将弹出一个快捷菜单,选择NewGroup,然后输入GUI。

    然后将所有跟UI有关的文件拖到这个文件夹( AppDelegate.swiftMasterViewController.swift/.xiband MainMenu.xib),如下图所示:


    然后新建另一个文件夹Model。


    在Model文件夹中将包含如下内容

    ·      ScaryBugData: 包含两个属性:昆虫的名称及昆虫的估价。

    ·      ScaryBugDoc: 包含3个属性:昆虫图片、昆虫缩略图及一个ScaryBugData属性。

    实现模型对象

    注意: 如果你阅读过 How ToCreate A Simple iPhone App on iOS 5 Tutorial, 你会发现接下来的内容和那篇教程中的相应内容几乎一模一样。这是因为Mac和iOS编程大部分SDK都是系统的,除了UI和操作系统相关的API。而模型对象不涉及UI,因此模型对象的代码基本是一致的。

    对于ScaryBug的模型类,将Mac版本与iOS版本只有一个地方不同,即将UIImage类修改为NSImage即可。当然,你也需要将它从O-C实现修改为Swift实现。

    在Model文件夹上点击右键,点击 “New File…”,然后选择OS X\Source\Cocoa Class 模板,然后点击Next。


    类名输入 ScaryBugData, Subclass of 输入 NSObject ,点击 Next。


    在最后一个弹出界面中,点击Create。项目导航窗口将显示如下:


    打开ScaryBugData.swift 替换为如下内容:

    import Foundation  

    class ScaryBugData: NSObject {

       var title: String

       var rating: Double  

       override init() {

        self.title = String()

        self.rating = 0.0  

    }

    init(title: String, rating: Double) {

         self.title = title

         self.rating = rating  

    }

    }

    然后创建另一个模型对象ScaryBugDoc

    打开ScaryBugDoc.swift 编辑为如下内容:

    import Foundation

    import AppKit  

    class ScaryBugDoc: NSObject {

       var data: ScaryBugData

       var thumbImage: NSImage?

       var fullImage: NSImage?

    override init() {

         self.data = ScaryBugData()

       }

    init(title: String, rating: Double, thumbImage: NSImage?, fullImage:NSImage?) {

         self.data = ScaryBugData(title: title, rating: rating)

         self.thumbImage = thumbImage

         self.fullImage = fullImage 

     }

    }

    注意thumbImage 和fullImage声明为可空的 NSImage ,因此他们不需要在默认构造函数中初始化。

    打开MasterViewController.swift ,增加一个属性声明:

    var bugs = [ScaryBugDoc]()

    这个数组属性用于存储昆虫列表,接下来我们将会用一些数据填充这个数组。

    填充数据及图片

    MasterViewController 需要用一系列昆虫来填充。你可以从此处下载所需的

     昆虫图片

    下载完图片之后,,将所有图片从Finder中拖到Images.xcassets中如下图右边AppIcon之下的位置:


    打开 MasterViewController.swift 添加如下方法:

    func setupSampleBugs() {

       let bug1 = ScaryBugDoc(title: "Potato Bug", rating: 4.0,

         thumbImage:NSImage(named: "potatoBugThumb"), fullImage:NSImage(named: "potatoBug"))

       let bug2 = ScaryBugDoc(title: "House Centipede", rating: 3.0,

    thumbImage:NSImage(named: "centipedeThumb"), fullImage:NSImage(named: "centipede"))  

       let bug3 = ScaryBugDoc(title: "Wolf Spider", rating: 5.0,

    thumbImage:NSImage(named: "wolfSpiderThumb"), fullImage:NSImage(named: "wolfSpider"))  

       let bug4 = ScaryBugDoc(title: "Lady Bug", rating: 1.0,

    thumbImage:NSImage(named: "ladybugThumb"), fullImage:NSImage(named: "ladybug"))

       bugs = [bug1, bug2, bug3, bug4]

    }

    打开AppDelegate.swift ,找到 applicationDidFinishLaunching方法,在addSubview之前加入以下代码:

    masterViewController.setupSampleBugs()

    编译运行程序,确保编译通过。

    接下来,我们将在UI中显示这些图片和数据。

    显示昆虫列表

    在 OS X中,Table View使用 NSTableView类,它等同于iOS的UITableView 类,但有一个最大的不同是:NSTableView 的每一行有多个列或多个单元格。

    ·      OS X 10.7Lion之前,table view cell继承于NSCell类。而后者并非NSView类,因此开发者需要自己处理绘图和鼠标事件。

    ·       OS X 10.7开始,table view从 NSView继承。这样就和UITableView差不多了。cell也有相应的View类型,因此也和iOS中的类似——这样我们就轻松得多了!

    在本教程中,使用的是基于View的TableView。如果你想了解NSTableView的用法,你可以阅读 这里, 它对 table views 的用法进行了详细的说明。

    打开MasterViewController.xib ,选中table view。注意Table View位于Scroll View中的Clip View中,因此第一个点击你选中的会是ScrollView,第二次点击你选中的才是ClipView,第三次点击才会选中Table View。

    当然,你也可以直接从IB的Objects面板中选择Table View对象(展开 Clip View对象)。

    选中Table View之后,在属性面板中,确认Content Mode一项是设置为View Based而不是Cell Based。同时,因为我们的列表仅显示单列,所以将Columns属性修改为1。

    勾选 “Alternating Rows”属性,让表格以“明暗颜色交替”的方式绘制单元格。

    反选 “Headers” 属性,因为我们不需要在表格上方显示一个标题。

    接下来我们修改单元格的大小。选择Table View上的列,拖动它的大小使其占据整个表格宽度。


    然后是单元格的配置。我们需要在单元格中显示昆虫的图片和名称,因此需要在Cell中添加一个Image和一个文本控件。

    IB中有一种带Image View和Text Field的NSTableCellView对象,我们可以使用它。

    在Object library 面板中,找到 “Image & Text Table Cell View”, 将它拖到Table View中。


    在Table View中,将原来的cell删除(用delete键)。

    选中Table View Cell,在Size面板中,将高度调整为32。

    然后选中Image View和 Text Field,使它们位于单元格中心,并调整ImageView和Text Field的大小,使它们看起来如下图所示:


    接下来要为每一列设置一个id。当然对于本教程来说,我们只有一个列,因此列id可能不是必须的。

    在Objects面板中选择表格列,打开Identity面板,将Identifier设置为BugColumn。


    如同在iOS中一样,Table View也有Data Source和Delegate属性。正常情况下,这两个属性都是同一个对象,即 MasterViewController

    选择Table View,打开Connections面板,在Outlets一项下找到delegate和data source。

    点击delegate右边的小圆圈,拖到Objects面板中的“File’s Owner”上。

    这将吧Table View 的delegate 属性设置为 MasterViewController。重复同样的动作,设置Data Source属性。

    最终如下图所示:

    打开 MasterViewController.swift 将下列代码放在文件最后:

    // MARK: - NSTableViewDataSource

    extension MasterViewController: NSTableViewDataSource {

       func numberOfRowsInTableView(aTableView: NSTableView!) -Int {

         return self.bugs.count  

    }  

       func tableView(tableView: NSTableView!, viewForTableColumn tableColumn: NSTableColumn!, row: Int) -NSView! {

         // 1

    var cellView: NSTableCellView =tableView.makeViewWithIdentifier(tableColumn.identifier, owner: self) asNSTableCellView      

    // 2    

    if tableColumn.identifier == "BugColumn" {

        // 3  

        let bugDoc = self.bugs[row]      

        cellView.imageView!.image = bugDoc.thumbImage

        cellView.textField!.stringValue = bugDoc.data.title

        return cellView    

    }      

    return cellView  

       }

    }  

    // MARK: - NSTableViewDelegate

    extension MasterViewController: NSTableViewDelegate { }

    我们通过扩展让MasterViewController 采用NSTableViewDelegate 和NSTableViewDataSource协议。

    要让列表渲染数据至少需要实现两个数据源方法。

    首先是numberOfRowsInTableView 方法,OS通过这个方法获取要渲染的表格行数。

    其次是tableView(_:viewForTableColumn:row:)方法。OS通过这个方法知道如何去渲染每行中的每个单元格。在这个方法中,我们需要用数据对单元格进行填充。

    运行程序,如果一切正常,我们将在表格中看到昆虫列表。

    下载资源

    为了完成本教程,你可能需要下载这些压缩包,并解压缩。

    注意: 为了将昆虫分成 “一点也不可怕” 到 “极度恐怖”几个级别,你还需要用到一个开源的分级组件EDStarRating,这也被包含在压缩包中。

    在本教程中,我们不会解释如何实现这个组件,而只是演示如何在项目中使用它。压缩包中还包括了一个NSImage类别,可以从一张大图片生成缩略图。 此外,还包括3张怪脸图片,分别用于显示昆虫的不同级别。

    关于 EDStarRating组件,你可以参考它的 github 主页.

    首先,在项目导航窗口中创建一个名为Art的文件夹,并将3个怪脸图片拖到这个文件夹中——确保“Copy items if needed” 已勾选, 以及Add to targets中的“ScaryBugsMac” 已选上。

    再创建一个名为“Views” 的文件夹, 将EDStarRating.h 和EDStarRating.m拖到该文件夹。 再次确保“Copy items if needed” 已勾选以及Add to targets中的“ScaryBugsMac” 已选上。


    点击Finish. 在下一窗口当被问到 “Would you like to configure an Objective-C bridgingheader?” 时选择Yes。这将创建一个Objective-C 类到Swift 代码的桥接头文件。


    对于 NSImage+Extras.h 和NSImage+Extras.m,重复上述步骤,只不过这次将它们拖进的是“Helpers”文件夹。

    打开ScaryBugsMac-Bridging-Header.h 加入以下import语句:

    #import "EDStarRating.h" #import "NSImage+Extras.h"

     

    以下为最终效果,其中桥接头文件已经被我们移到 Supporting Files 文件夹中:


    创建详情页面

    在iOS中,典型的“主-细页面App”需要创建两个视图,但在 OS X,由于屏幕不再受到限制,我们可以将它们合并在同一个视图中。

    打开MasterViewController.xib,选中view,将宽度和高度拖大。如图:


    我们需要显示下列信息: 昆虫名, 惊悚指数和昆虫图片。

    昆虫名用NSTextField 控件显示,惊悚指数用EDStarRating 控件显示,昆虫图片则用NSImageView显示。

    此外,我们还需要两个Label,用于表示每个字段的意义(标题)。

     

    拖一个 Text Field (昆虫名), 2个Labels (字段标题), 一个Image View 到view中。

    EDStarRating 控件是一个定制控件,无法在Objects Library中找到它,因此你需要先拖入一个 “Custom View”控件。

    将这些控件放到view的右边,从上到下依次摆放:

    ·      首先是一个Label,用于充当昆虫名的字段标题,在它下边是 textfield。

    ·      在text field下面是第二个 label(惊悚指数的字段标题)。

    ·      在这个label,下边是一个customview (后面将改成EDStarRating控件)。

    ·      最下面是image view below 控件。

    所有控件左对齐,如下图所示:


    然后选中custom view 控件,打开Identity面板(第三个标签按钮)将Class 修改为EDStarRating


    选择第一个label,打开Attributes 面板(第4个标签按钮),修改Title 为 “名称”.

    依照上面的方法,将第二个label的title 改为“Rating”。

    选择最顶级的 view (在document outline面板中显示为“Custom View”) ,打开Size 面板,查看它的大小:


    打开 MainMenu.xib, 选择 ScaryBugsMac window, 设置window 的宽高为前面记住的宽高。然后勾选MinimumSize 。


    运行后效果如下:


    EDStarRating控件并没有在界面上显示,这是因为我们还没有配置它。

    打开 MasterViewController.xib,打开Assistant Editor (工具栏中“Editor” 面板的第二个按钮), 并确保当前编辑的内容是MasterViewController.swift

    选中table View,按下右键,拖一条线到MasterViewController.swift文件中:


    这将弹出一个窗口,允许你创建一个IBOutlet。在Name中输入bugsTableView, Storage 设置为 Weak, 然后点击Connect。


    重复上述步骤,为text field和image view创建两个IBOutlet:

    bugTitleViewbugImageView

    对于custom view, 则创建一个IBOutlet: bugRating.

    最终, MasterViewController.swift文件中将新增如下内容:

    @IBOutlet weak var bugsTableView: NSTableView!

    @IBOutlet weak var bugTitleView: NSTextField!

    @IBOutlet weak var bugImageView: NSImageView!

    @IBOutlet weak var bugRating: EDStarRating!


    显示昆虫详情

    打开MasterViewController.swift 增加如下方法:

    func selectedBugDoc() -> ScaryBugDoc? {

       let selectedRow = self.bugsTableView.selectedRow;

       if selectedRow >= 0 && selectedRow < self.bugs.count {

    return self.bugs[selectedRow]

       }  

       return nil

    }

    这个方法根据用户选中的行索引,从数据模型中检索响应的对象。

    然后是这个方法:

    func updateDetailInfo(doc: ScaryBugDoc?) {

       var title = ""

       var image: NSImage?

       var rating = 0.0  

       if let scaryBugDoc = doc {

         title = scaryBugDoc.data.title

         image = scaryBugDoc.fullImage

         rating = scaryBugDoc.data.rating

       }  

       self.bugTitleView.stringValue = title

       self.bugImageView.image = image

       self.bugRating.rating = Float(rating)

    }

    这个方法根据ScaryBugDoc对象,将昆虫的信息和图片在UI上显示。然后是这个方法:

    func tableViewSelectionDidChange(notification: NSNotification!) {

       let selectedDoc = selectedBugDoc()

       updateDetailInfo(selectedDoc)        

    }

    当用户改变了在表格中的选择时,这个方法调用前两个实用方法。

    从OS X 10.10 Yosemite开始,View Controller 使用了新的

    viewWillAppearviewDidLoad,以及其它iOS风格的生命周期方法。而在OS X中传统的创建视图方法一般是 loadView(), 这个方法是向后兼容的,因此我们使用这个方法:

    override func loadView() {

       super.loadView()  

       self.bugRating.starImage = NSImage(named: "star.png")

       self.bugRating.starHighlightedImage = NSImage(named:"shockedface2_full.png")

       self.bugRating.starImage = NSImage(named:"shockedface2_empty.png")  

       self.bugRating.delegate = self  

       self.bugRating.maxRating = 5

       self.bugRating.horizontalMargin = 12

       self.bugRating.editable = true

       self.bugRating.displayMode = UInt(EDStarRatingDisplayFull)  

       self.bugRating.rating = Float(0.0)

    }

    在这里,我们初始化EDStarRating控件:用于表示昆虫惊悚指数的图片,控件的delegate属性以及其它参数。

    然后在MasterViewController.swift 最后增加一个extension声明:

    // MARK: - EDStarRatingProtocol  

    extension MasterViewController: EDStarRatingProtocol {   }

    等下在来实现这个EDStarRatingProtocol 协议。

    先编译运行程序,效果如下:


    添加删除

    打开MasterViewController.xib ,拖两个“Gradient Button” 到 table view下。 选择其中一个按钮, 打开 Attributes 面板,删除Title属性中的内容,然后在Image属性选择,这将使按钮显示为一个“+”号。

    同样,将另一个按钮设置为“-”号按钮(Image属性选择为 “NSRemoveTemplate”)。


    打开Assistant Editor 窗口,确保当前内容为MasterViewController.swift文件,首先添加一个扩展的定义:

    // MARK: - IBActions  

    extension MasterViewController {   }

    严格来说这个扩展并非必须,但通过这种方式,我们能更好地组织我们的Swift代码。然后选择加号按钮,右键拖一条线到这个扩展上。


    在弹出的窗口中,Connection一栏选择Action,Name一栏输入 addBug, 然后点击Connect.


    这样将创建一个 addBug(_:) 方法,每当加号按钮被点击,系统将调用这个方法。在减号按钮上重复同样步骤, Name请使用 deleteBug.

    打开 MasterViewController.swift实现addBug方法如下:

    // 1. 使用默认值创建一个新的ScaryBugDoc实例

    let newDoc = ScaryBugDoc(title: "New Bug", rating: 0.0, thumbImage: nil, fullImage: nil)  

    // 2. 将该实例添加到model 数组

    self.bugs.append(newDoc)

    let newRowIndex = self.bugs.count - 1  

    // 3.table view插入新行

    self.bugsTableView.insertRowsAtIndexes(NSIndexSet(index: newRowIndex), withAnimation: NSTableViewAnimationOptions.EffectGap)  

    // 4. 选中并滚动到新行

    self.bugsTableView.selectRowIndexes(NSIndexSet(index: newRowIndex), byExtendingSelection:false)

    self.bugsTableView.scrollRowToVisible(newRowIndex)

    实现deleteBug()方法如下:

    // 1. Get selected doc

    if let selectedDoc = selectedBugDoc() {

       // 2. Remove the bug from the model

       self.bugs.removeAtIndex(self.bugsTableView.selectedRow)

       // 3. Remove the selected row from the table view 

       self.bugsTableView.removeRowsAtIndexes(

    NSIndexSet(index:self.bugsTableView.selectedRow),

    withAnimation: NSTableViewAnimationOptions.SlideRight)  

       // 4. Clear detail info  

       updateDetailInfo(nil)

    }


    编辑

    打开 MasterViewController.xib, 打开 Assistant Editor, 确保当前显示的文件是 MasterViewController.swift

    选中text field, 右键拖到 MasterViewController.swift 文件中的addBug()方法之前:


    这将允许你为Text Field创建一个IBAction,Name 请使用bugTitleDidEndEdit


    这个方法将在text field结束编辑时调用(当用户按下回车键或者离开Text Field控件)。

    回到MasterViewController.swift, 添加方法:

    func reloadSelectedBugRow() {

       let indexSet = NSIndexSet(index: self.bugsTableView.selectedRow)

       let columnSet = NSIndexSet(index: 0)

       self.bugsTableView.reloadDataForRowIndexes(indexSet, columnIndexes:columnSet)

    }

    在这个方法中,我们重新加载该行数据模型,你需要在模型数据被改动后调用这个方法。

    bugTitleDidEndEdit 方法实现如下:

    if let selectedDoc = selectedBugDoc() {

       selectedDoc.data.title = self.bugTitleView.stringValue

       reloadSelectedBugRow()

    }

    首先,调用selectedBugDoc()获得相关昆虫的信息,然后从text field读取文本字符串,并用它来更新模型中的昆虫名称。最后调用reloadSelectedBugRow()通知单元格进行刷新。

    注意: 通知table view自己刷新cell要比直接操纵cell的内容要好。

    运行App,从列表选中某个昆虫,尝试修改其名称(记得按回车键),表格中的昆虫名将随之改变!

    但是如果你切换到其他昆虫,然后返回修改的那一个昆虫,你会发现数据又回到原来(未改动前)了。这是因为我们没有将模型对象进行持久化(保存进文件)。




    接下来实现EDStarRating 的编辑。 在loadView 方法中,我们已经配置了EDStarRating的delegate属性,我们仅仅需要实现相关委托方法即可。

    打开MasterViewController.swift 在 EDStarRatingProtocol 扩展中添加如下方法:

    func starsSelectionChanged(control: EDStarRating!, rating: Float) {

       if let selectedDoc = selectedBugDoc() {

    selectedDoc.data.rating = Double(self.bugRating.rating)

       }

    }

    跟前面几乎一样: 获得用户选定的昆虫模型,用修改后的值赋值给它。

    运行程序。需要注意的是,用户设定新的评级后这个值是被持久化的,哪怕你切换到其他昆虫然后有切换回来。


    获取本地图片

    打开 MasterViewController.xib,拖一个“Push Button” 控件到image view下方。

    修改按钮的title 为 “Change Picture”:


    如同加号按钮和减号按钮,为Change Picture 按钮创建一个IBAction,命名为 changePicture

    这个action在按钮点击时调用。

    OS X 有一个特有的控件叫做 IKPictureTaker,允许用户从计算机上选择一张图片,或者从摄像头捕捉一张图片。

    当用户选择了图片之后,这个控件会调用指定的delegate方法。

    打开MasterViewController.swift 加入以下import 语句:

    import Quartz

    这个 image picker属于 Quartz 框架。

    changePicture方法中,添加代码:

    if let selectedDoc = selectedBugDoc() {

       IKPictureTaker().beginPictureTakerSheetForWindow(self.view.window,

    withDelegate: self,

         didEndSelector: "pictureTakerDidEnd:returnCode:contextInfo:",

         contextInfo: nil)

    }

    我们先检查用户是否选择了有效的昆虫,如果是,显示picture taker控件。

    然后实现pictureTakerDidEnd(_:returnCode:contextInfo:)方法:

    func pictureTakerDidEnd(picker: IKPictureTaker, returnCode: NSInteger, contextInfo: UnsafePointer<Void>) {

       let image = picker.outputImage()

       if image != nil && returnCode == NSOKButton {

    self.bugImageView.image = image

    if let selectedDoc = selectedBugDoc() {

           selectedDoc.fullImage = image

           selectedDoc.thumbImage =image.imageByScalingAndCroppingForSize(CGSize(width: 44, height: 44))       reloadSelectedBugRow()

    }  

       }

    }

    首先检查用户是否点击了OK (NSOKButton) 以及选择的图片是否有效。

    如果是,获取用户选定的昆虫模型,修改昆虫的图片及缩略图,然后更新cell。

    运行程序,选择一个昆虫,点击Change Picture, 从本地文件或摄像头中获取一张图片,这张图片将立即在选定的cell中得到更新。

    一些细节上的问题

    当你运行程序,视图改变窗口大小,你会发现控件并不能自动适应大小。


    这是窗口拖大后的效果。


    pplns:o="urn:schemas-microsoft-com:office:office"xmlns:w="urn:schemas-microsoft-com:office:word"xmlns:m="http://schemas.microsoft.com/office/2004/12/omml"xmlns="http://www.w3.org/TR/REC-html40">

    这是窗口缩小后的效果。

    另外,我们还没有为App数据进行持久化。一旦App重启,用户对数据进行的增加和修改都会丢失。

    打开MasterViewController.xib,将View的Size缩小至最小能够足以显示所有控件的程度。


    在上图中,3个按钮放在了同一排。在右边细节展示区域中,所有的控件都左对齐,且宽度一致(除了ChangePicture按钮)。

    然后,我们在中间增加一个分割线。拖一个 VerticalLine 到View的中央。


    复原操作

    复原操作用于将数据恢复至原来的状态。拖一个Push 按钮在Table View下方,修改其标题为Reset。然后打开Assistant Editor,为按钮创建一个IBAction,名为resetData(确认当前打开的源文件为MasterViewController.swift )。


    resetData()方法加入如下代码:

    setupSampleBugs() 
    updateDetailInfo(nil) 
    bugsTableView.reloadData()

    setupSampleBugs() 方法调用会恢复所有模型数据。 以nil作为参数值调用updateDetailInfo 方法将清除所有细节字段。然后刷新Table View。

    运行程序,添加、删除或修改任意数据。然后点击Reset按钮,所有数据又恢复原样。




    缩放

    打开MasterViewController.xib,在Size面板中查看 Custome View的大小。在本例中,它应该是540x400大小。但是读者的这个数字会有不同。不管是多大,请记下这个数字。待会会用到。


    这将是App出口的最小大小。打开 MainMenu.xib, 选择 window 对象。在Size 面板中,勾上Constraint右边的Minimum Size 选项,然后将width 和 height 修改为同样的值。


    运行程序。


    改变出口的大小,这次当窗口缩小到最小尺寸后,就无法再缩小。

    接下来我们需要解决控件自适应大小的问题,包括TableView和细节页面中的控件。

    首先是MasterViewController视图。

    打开 AppDelegate.swift, 在applicationDidFinishLaunching()方法最后加入:

    // 3. 设置 masterViewController.view的布局约束 masterViewController.view.translatesAutoresizingMaskIntoConstraints = false 
    let verticalConstraints = NSLayoutConstraint.constraintsWithVisualFormat("V:|[subView]|",
       options: NSLayoutFormatOptions(0),
       metrics: nil,
       views: ["subView" : masterViewController.view]) 
    let horizontalConstraints = NSLayoutConstraint.constraintsWithVisualFormat("H:|[subView]|",
       options: NSLayoutFormatOptions(0),
       metrics: nil,
       views: ["subView" : masterViewController.view])   
    NSLayoutConstraint.activateConstraints(verticalConstraints + horizontalConstraints)

    在这里,我们允许MasterViewController在宽、高两个维度上使用自动布局。

    接下来,我们使用IB的自动布局来约束来对table view进行布局,以便在窗口大小改变时,让它的高度自动增长,但宽度保持恒定。

    打开 MasterViewController.xib ,选择table view,点击右下角的Pin 按钮, 勾上上、左、下3个约束,以及一个等宽约束,然后点击 “Add 4 Constraints”:


    注意图片中的约束值可能和读者的实际值有所不同。

    然后选择Reset按钮,设置其与Table View的上边距约束和一个相对于Main View的左边距约束:


    接着选择分隔线,设置其与Main View的上、下边距约束,以及与TableView的左边距约束,确认在左边距约束的下拉列表中选择了 “Bordered ScrollView – Table View” :


    接下来设置“Add” 和 “Delete” 按钮。我们不需要改变它们的大小,唯一需要改变的是它们和Table View之间的距离。对于两个按钮,我们需要设置它们的左、上,宽度和高度约束。已Add按钮为例,显示如下图:


    Delete按钮类似。

    运行程序,改变窗口大小,查看效果。


    然后是右边的细节页面。在这个页面中,当窗口宽度变大时,所有控件的宽度也会变大。以TableView相同的方法,分别设置它们的自动布局如下:

    ·      设置Name标签的左、上约束。

    ·      设置bugTitleView的左、上约束。

    ·      设置Rating标签的左、上约束。

    ·      设置 bugRating的左、上、右和高约束。

    ·      设置bugImageView的左、上、下、右约束。

    ·      移动 Change Picture 按钮,以便它的右边沿刚好和bugImageView的右边沿平齐,然后设置它的右、下约束。

     

    设置完bugImageView 按钮可能会出现几个警告,但ChangePicture 按钮之后,这些警告会消除。

    上述步骤做完后,故事板将如下图所示:


    编译运行,再次缩放窗口。


    bugImageView的Scale设置会对图片产生不同的显示效果。在IB中选择Image Well 控件, 修改其scaling属性为“Proportionally Up or Down” 或者 “Axes Independently”,然后运行App,看看有什么不同。

    注意: 如果你想限制窗口的最大缩放尺寸,则你也可以用设置窗口最小缩放尺寸同样的方式加以限制。



    关注细节

    关于用户体验方面,我们仍然有一些细节值得注意。例如:运行App,不要选择任何昆虫,点击“Delete” 或者 “Change Picture” 按钮,什么都不会发生,Why?

    作为程序员,你当然知道当用户什么都没选择的情况下,不应当执行任何操作,但对于用户而言,这种情况仍然显得不太友好:


    我们通过以下方式来解决这个问题:

    ·      如果用户选中了某个单元格,我们才让Delete按钮、Change picture按钮、文本框和rating view可用。

    ·      如果用户未选择任何行,我们禁用上述控件,用户将不能和它们进行任何交互。

    打开MasterViewController.xib,选择Delete按钮,在属性面板,将Enabled属性前的勾去掉。


    在ChangePicture 按钮、text field上重复上述步骤。

    这样,当程序刚启动时,上述控件将被禁用。然后我们需要在用户选择了表格中的单元格之后再启用它们。要实现这个目的,我们首先需要为它们创建IBOutlet。

    打开AssistantEditor 确保当前编辑的文件为MasterViewController.swift

    选择“Delete” 按钮,右键将它拖动到 MasterViewController.swift文件中。


    在弹出的出口中,选择connection为“Outlet”, name 栏输入 deleteButton,然后点击Connect.


    重复上述步骤,为Changepicture按钮创建一个IBOutlet,名为changePictureButton.

    打开MasterViewController.swift, 在tableViewSelectionDidChange(_:),加入以下代码,位于 updateDetailInfo(selectedDoc)一行以后:

    // Enable/disable buttons based on the selection 
    let buttonsEnabled = (selectedDoc != nil) 
    deleteButton.enabled = buttonsEnabled 
    changePictureButton.enabled = buttonsEnabled 
    bugRating.editable = buttonsEnabled 
    bugTitleView.enabled = buttonsEnabled

    我们首先判断控件是否需要被启用,这是通过用户是否选中单元格来决定的。如果selectedDoc为空,则意味着没有行被选中,这说明控件应当被禁用,否则启用控件。

    此外,ratingview 默认是启用的,所以我们还需要在

     loadView() 中禁用它。找到这行语句:

    self.bugRating.editable = true

    修改为

    self.bugRating.editable = false

    运行程序。

    注意: 你还可以在用户未选择有效行时讲整个细节页面都隐藏起来,但这完全取决于你。

    保存数据

    就像iOS,Mac App也能够使用 NSUserDefaults, 因此我们完全可以把数据存放到那里。

    首先我们必须让模型类实现NSCoding 协议。在ScaryBugData.swift 中定义一个扩展:

    // MARK: - NSCoding   
    extension ScaryBugData: NSCoding {
       func encodeWithCoder(coder: NSCoder) {
    coder.encodeObject(self.title, forKey: "title")
    coder.encodeObject(Double(self.rating), forKey: "rating")
       } 
    }

    首先我们让ScaryBugData实现NSCoding协议中的 encodeWithCoder方法。这个方法用于对自定义类进行编码。

    同时还需要一个与之对应的初始化方法。不同的是,我们无法在扩展中定义required的init方法,因此必须把它定义在类代码中:

    required convenience init(coder decoder: NSCoder) {
       self.init() 
       self.title = decoder.decodeObjectForKey("title") as String
       self.rating = decoder.decodeObjectForKey("rating") as Double 
    } 

    init(coder:) 方法和encodeWithCoder方法向反,用于从文件中读取数据并反编码为对象。

    然后在ScaryBugDoc.swift 中定义一个扩展实现 NSCoding 协议:

    // MARK: - NSCoding 
    extension ScaryBugDoc: NSCoding {
       func encodeWithCoder(coder: NSCoder) {
    coder.encodeObject(self.data, forKey: "data")
    coder.encodeObject(self.thumbImage, forKey: "thumbImage") 
    coder.encodeObject(self.fullImage, forKey: "fullImage")
    } 
    }

    然后在类代码中(不要在扩展定义中)定义Init方法:

    required convenience init(coder decoder: NSCoder) {
       self.init()
       self.data = decoder.decodeObjectForKey("data") as ScaryBugData
       self.thumbImage = decoder.decodeObjectForKey("thumbImage") as NSImage?
       self.fullImage = decoder.decodeObjectForKey("fullImage") as NSImage? 
    }

    接下来将模型数据保存到NSUserDefaults. 在 MasterViewController.swift中添加一个方法:

    func saveBugs() {
       let data = NSKeyedArchiver.archivedDataWithRootObject(self.bugs)
       NSUserDefaults.standardUserDefaults().setObject(data, forKey: "bugs")
       NSUserDefaults.standardUserDefaults().synchronize() 
    }
    这个方法首先将bugs数组构建为一个NSData对象,然后保存到

    NSUserDefaults.NSKeyedArchiver。当然数组中的所有对象都实现了 NSCoding.

    打开 AppDelegate.swift, 在applicationWillTerminate()中加入:

    masterViewController.saveBugs()

    这样,在App退出之前,将所有昆虫数据保存到了 NSUserDefaults.

    加载数据

    AppDelegate.swift, 找到applicationDidFinishLaunching 的

    masterViewController.setupSampleBugs()

    替换为

    if let data = NSUserDefaults.standardUserDefaults().objectForKey("bugs") as? NSData {
       masterViewController.bugs = NSKeyedUnarchiver.unarchiveObjectWithData(data) as [ScaryBugDoc] 
    } else {
       masterViewController.setupSampleBugs() 
    }

    运行程序,添加、删除和编辑昆虫数据,然后退出程序。重新启动App之后,所有上次进行的修改都被保留住了。

    注意: 如果应用程序不是正常的退出,则saveBugs() 方法不会调用 — 请用Command-Q 退出程序,而不是从Xcode中终止程序。要解决这个问题,你可以在MasterViewController的某个恰当的时机调用saveBug()方法——只要用户进行过新建、删除和编辑操作。

     





    展开全文
  • Swift学习资料@ SwiftGuide很赞 的Swift学习资料 leetcode一个练习、评估自己水平的代码平台,跟ACM有点类似 完整App@ Swift 30 Projects- 最新 Swift 3.0 的30个小App,更注重代码规范和架构设计(故胤道长) V2...

    Swift学习资料@

    SwiftGuide很赞 的Swift学习资料

    leetcode一个练习、评估自己水平的代码平台,跟ACM有点类似

    完整App@

    Swift 30 Projects- 最新 Swift 3.0 的30个小App,更注重代码规范和架构设计(故胤道长)

    V2ex-Swift- 用 Swift 写的 V2EX 客户端。

    iBBS-Swift- “新手开源一个用Swift(2.0)写的论坛客户端”。BBS 服务端

    NirZhihuDaily2.0_swift- 精仿了知乎日报iOS端练手,Swift2.0,注释相当详细。

    DesignerNewsApp- Swift 开发的 DesignerNews 客户端,看着美美的!

    Eidolon- 艺术品拍卖的投标亭平台,用swift与反应式编程框架 ReactiveCocoa。

    BaiduFM-Swift- 百度FM, swift语言实现,基于最新xcode6.3+swift1.2,初步只是为了实现功能,代码比较粗燥,后面有时间会整理,支持Apple Watch。

    Tuan- 模仿MJ老师iPad版美团(swift版),偶有bug 见谅。

    CocoaChinaPlus- CocoaChina+是一款开源的第三方CocoaChina移动端。整个App都用Swift2.0编写(除部分第三方OC代码外,比如JPush和友盟)。

    SimpleMemo- 易便签已经转到Swift2.0,全面适配iOS9和Watch OS2,并支持iPhone6s和iPhone6sPlus的3D Touch功能,包括图标快捷键和内容预览。

    furni-ios.swift- furni-ios.swift是由 Twitter 开发团队出品的一款用 Swift 写的 iOS 家居商城应用, 其主要目的在于让开发者从这款 Demo 应用中看出 Fabric 的强大。

    SelectionOfZhihu.swift- 『看知乎』iOS 客户端,项目说明

    Yep.swift- Yep 一个由天才开发给天才们使用的社交软件。

    LoveFreshBeen.swift- 高仿爱鲜蜂 - Swift2.0

    trySwiftApp.swift- trySwiftApp一款较为完整的会议原型应用。有需求的同学可以做为开发参考。

    PinGo.swift- PinGo.swift:纯Swift编写的仿“随遇”App。

    UmbrellaWeather.swift- UmbrellaWeather.swift使用 Swift 编写的一款天气应用,现已上架 AppStore。

    SwiftWeather- SwiftWeather清新淡雅持续改进天气预报项目。

    Phonetic.swift- Phonetic一个 iOS 版的 Phonetic Contacts,功能很多,其中昵称功能非常实用,已在 GitHub 开源并上架 App Store。

    edhita.swift- edhita.swift支持Markdown, HTML预览的文本编辑器。

    PilesSugar.swift- PilesSugar.swift:Swift高仿项目,堆糖。

    react-native-gitfeed- 目前最实用简洁的github客户端了。

    SoundCloudSwift- SoundCloud的Swift版本,采用Swift2.0,Reactive API with ReactiveCocoa 4.0。

    LeagueofLegends- 一个关于英雄联盟的完整iOS开源项目,接口均来自多玩,腾讯各大游戏平台。

    Coderpursue.swift- 一款 Github 第三方客户端,使用最新 Swift 语言编写。

    BTApp- BTApp 仿半糖 iOS App 的 Demo 应用。

    LXFFM高仿喜马拉雅FM

    Xcode8插件@

    FileExplorer完整的文件资源管理器组件.

    App框架@

    katana-swift- Swift Apps in a Swoosh! A modern framework for creating iOS apps, inspired by React and Redux.http://katana.bendingspoons.com

    响应式框架

    RxSwift- RxSwift:函数响应式编程框架。

    RxPermission.swift- 通过绑定 RxSwift 实现的 RxPermission。

    Permission.swift- 统一的 API 请求 iOS 本地设备及资源权限类库。

    ReactiveAnimation- ReactiveCocoa 推出了一个叫 ReactiveAnimation 的子项目,直接用完全用 Swift 来实现了。

    Swiftest- BDD 全称 Behavior Driven Development,行为驱动开发。各种 DD 数不胜数,孰优孰劣争论不休,其实归根结底还是要根据使用场景进行选择。

    页面路由

    ACRouter- Swift版页面路由, 组件化过程中快速页面解耦.

    UI@

    日历@

    FSCalendar- 一个包含objective-c和Swift版本的优秀的日历

    FSCalendar一款漂亮,强大的 iOS 日历组件 A fully customizable iOS calendar library, compatible with Objective-C and Swift

    下拉刷新@

    ZLSwiftRefresh- swift下拉刷新/上拉加载更多,支持自定义动画,集成简单,兼容UITableView/CollectionView/ScrollView/WebView。

    BreakOutToRefresh- swift,上拉和下拉刷新。

    GearRefreshControl- swift,上拉和下拉刷新。

    refresher- swift,上拉和下拉刷新。

    ReplaceAnimation.swift- 基于 @ZeeYoung欧阳哲 同学的创意下拉刷新动画实现。值得称赞还有额外增加了“取消及滚动”效果支持。

    PullToReflesh-Swift- 一款炫酷的下拉刷新封装库(Mobile page refresh concept inspired by Google and for something like a news app)。源码分析

    pull-to-refresh.swift- 是一款非常易于开发者使用的下拉刷新和加载更多组件。通过一个 UIScrollView 的扩展,可以轻松为 UIScrollView 的所有子类添加下拉刷新功能。

    模糊效果@

    Blurable.swift- swift模糊组件。

    富文本@

    RichEditorView- swift,一套可定制富文本编辑器组件及示例。功能完整、代码简练、实现逻辑巧妙(编辑器核心与 WebView 结合,采用 HTML5 contentEditable 编辑模式,执行JS 配套命令 execCommand 实现富文本编辑功能)。

    SwiftyMarkdown.swift- 用swift写的markdown解析库。

    Marklight.swift- Markdown 语法高亮显示编辑库(Swift)。

    LTMorphingLabel- swift 能够实现文字变形动画效果的Label,用Swift写的一个能够实现文字变形动画效果的Label,很炫。

    Splitflap.swift- 可用于快速给 iOS 应用创建文字翻转的动画效果。

    FloatLabelFields.swift- FloatLabelFields.swift浮动标签输入效果类。

    cleartext-mac.swift- 提供一千个常用单词的编辑器。

    GlitchLabel.swift- 可定制“黑(故障)文字标签”类库,熟称晃瞎你的眼文字标签。

    颜色@

    图表@

    swift-linechart- 功能完整、实用的折线图组件。使用方便,参数配置简单。是不可多得的优质组件--swift。

    ios-charts- 一款优秀 Android 图表开源库 MPAndroidChart 的 Swift 语言实现版(支持 Objective-C 和 Swift 调用)。缺省提供的示例代码为 Objective-C。

    Scrollable-GraphView.swift- 灵动感十足的自适应、可定制滚动曲(折)线图表库。

    TableView@、CollectionView@

    表相关(TabbleView、Tabbar、即时聊天界面)@

    SwipeCellKit很赞的tableView左滑删除效果

    Eureka.swift- Eureka 是 XLForm 的 Swift 的移植版本, 一个可以帮助开发者们快速构建 iOS 各种复杂表单的库, 具有较高的可扩展性, 方便自定制样式。

    HBHorizontalTableView- swift,TableView 横向滚动小示例(仿照 AppStore 应用展示)。

    Chats- 聊天 UI 示例程序。此项目应该只为演示或学习之用,没有服务器 -- swift。

    Chatto.swift- Chatto.swift:轻量级聊天应用框架及示例。文字及图片可扩展输入栏,汽泡效果等聊天核心特性,分页及自动布局完善。

    COBezierTableView- swift,通过编辑 Bezier 曲线四点位置设置 TableView 内 Cell 及对应按扭位置。实验效果很赞。

    LxTabBarController- 改变了原生tabbar切换tab时的生硬效果,并加入滑动切换手势(有和界面上的其它手势发生冲突的风险,可根据具体项目予以关闭),swift版本

    Sapporo- swift 单元格模型驱动的集合视图管理器组件。又一个超实用的“轮子”。

    NavTopImage.swift- NavigationController动态缩放titleView。

    paper-onboarding.swift- 漂亮的 material design 风格页面滑块。示例完整,易用。

    Material.swift- 基于 Material Design 动画和图像框架库 (作者 Daniel Dahan)。

    ReorderableGridView-Swift- 拖拽排序卡片。

    ZYThumbnailTableView.swift- 可展开型预览TableView,开放接口,完全自由定制。实现教程

    WHC_CollectionViewFramework.swift- 高仿支付宝可拖拽排序编辑动画效果cell的CollectionView集合视图。

    SwipeViewController.swift- 一款好用的页面滑动和标签选项卡类库及示例。功能相当于 Objective-C 版 RKSwipeBetweenViewControllers。

    TabDrawer.swift- 更适合单手操作的可定制 Tab Bar 组件库。P.S. 自动布局选择了 EasyPeasy。

    SFFocusViewLayout.swift- UICollectionViewLayout实现的图片浏览器。

    ESTabBarController.swift- 自定义TabBarController组件,继承自UITabBarControlle,可添加动画和自定义样式。swift 高度自定义TabBarController,支持自定义TabBarItem样式或添加动画

    GLTableCollectionViewNetflix and App Store like UITableView with UICollectionView, written in pure Swift 3.0

    EditDistancetableView、CollectionView 数据重载更新效果Demo

    CenteredCollectionView轻量级的CollectionViewCell左右滑动效果,类似电影App选电影的效果

    隐藏与显示@

    HUD与Toast@

    Toast-Swift- 高可定制易用的 Toast 弹出信息或通知用户界面组件类。

    对话框@

    SwiftyDrop- 轻量、易用的小清新弹出列表及信息提示组件真心不错。

    PCLBlurEffectAlert.swift- 细节定制较丰富的弹出警报窗口组件。

    GSAlert.swftt- 苹果在iOS8推出了全新的UIAlertController,旧的UIAlertView和UIActionSheet渐渐被废弃,但如果你仍然支持iOS7系统,你将不得不写两套代码。GSAlert解决了这个问题。

    TKSwarmAlert.swift- TKSwarmAlert.swift:模仿 Swarm app 的 Alert 提醒框动画工具。

    PMAlertController.Swift- 可定制弹窗组件替代官版不可定制的 UIAlertController。

    TBActionSheet.swift- 支持Carthage,可自定义度100%的 ActionSheet,支持微信样式。

    NoticeBarNotice View相关的简易库,叫做NoticeBar, 在NavigationBar、Tabbar、statusBar上显示提示信息,信息可包含文字和图片等,并且内置了四种提示消息。

    popover@

    panelkit手势拖动弹出面板视图 A UI framework that enables panels on iOS.

    ElongationPreview- 一个优雅的push-pop风格的视图控制器 ElongationPreview is an elegant push-pop style view controller with 3D-Touch support and gestures.?

    Pageboy- 一个简单、易学的page View Controller A simple, highly informative page view controller.?

    状态栏@

    导航栏@

    Tiptoes提供了一种自定义 Navigation Bar 的新思路,并实现了转场渐变效果,灵感来自于 Unread 。

    设置@

    Switch@

    Label@

    LTMorphingLabel炫酷的Label效果 Graceful morphing effects for UILabel written in Swift.

    主题@

    电影选座@

    瀑布流@

    [ELWaterFallLayout](https://github.com/NicolasKim/ELWaterFallLayout)swift可定制瀑布流布局 UI 组件。

    菜单@

    Swift-CircleMenuSwift-CircleMenu:一款圆盘式菜单,Rotating circle menu written in Swift 3

    TabBar@

    CBMDTabbarControllerIt is a smooth MD tabbarController used on iOS, which implement by Swift.

    进度@

    KYCircularProgress- 简单、实用路径可定进程条。

    引导页@

    MZGuidePages- 自己写的通用导航页,可以直接引入工程使用,请参考案例(版本新特性、导航页、引导页)。

    Intro简单的功能引导组件

    Wizardry.swift- 可重用的方法和框架实现向导式用户界面管理。(版本新特性、导航页、引导页)。

    page@

    XLPagerTabStrip- 非常赞 的iOS下的PagerTabStrip。

    PinterestSegment仿 Pinterest 的 Segment 控件(swift), 行数 200+

    评分@

    iOS-RatingBar- iOS-RatingBar swift版的评分控件,跟Android的RatingBar一样有两种模式,评分模式和只读模式'支持视图编辑,自定义星星数量,评分等级,另外还能支持非整数星,0.5颗星,0.1颗星,可以开启动画效果。

    SwiftyStarRatingViewSwiftyStarRatingView 是一个用 swift 3.0 编写的评分控件,可以支持自定义图片和颜色,并且可以支持在XIB、StoreBoard中使用,并支持AutoLayout。

    Color@

    IGColorPicker- 一个自定义颜色选择器�A customizable color picker for iOS in Swift?

    其他UI@

    KDCircularProgress- KDCircularProgress是使用swift制作的色彩炫丽的进度条,可以加入多种颜色来控制进度条的渐变效果。

    RandomColorSwift- 一个自动生成好看的颜色的 Swift 库,RandomColorSwift。

    Hue.Swift- Hue.Swift:颜色常规功能集于一身的定义、使用 Color 工具类库(含图片取色)。

    KtColor.swift- 利用 Swift 的语法特性简化创建 UIColor对象的过程。具体文章可以参考博客:当UIColor遇上 Swift

    YPDropMenuViewDemo.swift- 一款DropMenu,menuView,类似之前美团的下拉菜单,支持swift2.2,因为用到iOS8.的毛玻璃。所以想支持到iOS8.0,支持自定义,支持等宽排列,支持从左向右排列。

    ZMaterialDesignUIButton- Swift Material Design UIButton。

    Twinkle- 为字体加上钻石版闪耀的效果。使用Swift编写。

    Persei- 非常赞 动画隐藏或显示顶部菜单支持库及示例项目。--swift

    DateRangePicker.swift- 可能是目前最好的 OS X 日期选择器,高扩展性,界面风格看起来很舒服,不过注意,是 OS X 开发专用。

    SwiftyFORM- swift 表单输入框架(亮点是表单验证规则引擎),是我见过地最易用的 Swift 表单组件。

    SwiftSpinner- SwiftSpinner是使用swift制作的一款精致带感的指示器,并且连带有字体信息显示,模糊背景,半透明,扁平化等IOS8的效果。

    AKPickerView-Swift- 一款小而美的 3D 效果选择器。

    LxGridView-ocLxGridView-swift- 利用UICollectionView模仿iOS系统桌面图标的交互,作用如动图。

    WMDragViewWMDragView可以自由拖曳的view

    GMStepper- swift 带动画效果、支持手势滑动操作的步进标签。

    LayoutTrait- swift 一个小类库。 做iPad 多任务分屏 适配的同学可以看一下。

    BTNavigationDropdownMenu- 下拉列表暨导航标题组件。简单、直接、易用 -swift。

    InceptionTouch.swift- 让没有 3D Touch 设备也有类似交互体验的 InceptionTouch 类(基于 UITextView 实现,支持日期,链接,电话号码,地址触摸响应)。

    TWControls.swift- 简单的开关和按钮控制器,使用闭包来执行由控件触发的操作。

    Instructions.swift- 可定制嵌入式操作指引框架及演示。

    SMSegmentView.swift- 高可定制化,既支持横向,也支持纵向布局的图文 Segment Control 组件,节选器。

    Gecco.Swift- Gecco.Swift 是一款支持对视图进行局部高亮的 Swift 库, 帮助 iOS 开发者快速创建产品的新手指导界面。

    SubtleVolume.swift- 更隐蔽的系统音量替代指示器。

    InkKit.swift- 该类库帮助开发者绘制简单图形更容易。

    SwiftSVG- 支持多种接口(String, NS/UIBezierPath, CAShapeLayer, and NS/UIView)绘制 SVG 类库。

    LeeGo.swift- 带来更 声明式的,可配置的和易复用的UI开发方式,让UI开发变得像玩乐高积木一样简单直观,某种程度上取代ComponentKit。用 struct 和 enum 来构建你的整套 UI

    Caishen.swift- 简易、实用的付款输入及校验 UI 组件。

    CreditCardForm-iOS信用卡输入效果

    StackViewController- 方便 iOS 开发者使用 UIStackView 构建表单或其它静态内容视图。

    LLBootstrapButton- Bootstrap 3.0扁平化风格按钮,自带图标,一句代码直接调用!

    JMRoundedCorner- UIView设置不触发离屏渲染的圆角!

    PagingMenuController- 侧滑页面切换ViewController库,支持页面标题定制

    ZSeatSelector- 电影院位置排座位,电影选座。

    JMRoundedCornerSwift- swift版本:UIView设置不触发离屏渲染的圆角!

    PPNumberButtonSwift- 仿京东淘宝商品数量的加减按钮 Swift 版,可定制程度高,使用简单!

    多线程@

    Overdrive专注于类型安全、并发和多线程的,快速 、专业的异步任务库 Fast async task based Swift framework with focus on type safety, concurrency and multi threading

    JobsSwift Job 队列

    Kommander-iOSSwift 多线程任务管理库,很强大。

    GCDKit简单的GCD用法

    AsyncGCD异步派遣的语法糖

    SwiftSafe线程同步、线程安全

    YYDispatchQueuePool管理全局派遣队列的实用类

    AlecrimAsyncKitSwift关于异步、等待的一些好的经验

    Threader- 漂亮的GCD使用和简单执行

    Dispatch让GCD更容易、简单使用的轻量级的库 Just a tiny library to make using GCD easier and intuitive?

    GCDTimer- Well tested Grand Central Dispatch (GCD) Timer in Swift.

    Chronos-SwiftGCD工具类

    Me嵌套异步计算的一个超级轻量级的解决方案

    SwiftyTask一个高性能的排队系统,用于管理App中的全部任务。

    游戏@

    动画@

    侧滑与右滑返回手势@

    SideMenu- swift实现,一款带动画效果可定制 Slide Menu,可以学习其动画实现思路。P.S. 对于Hamburger式菜单,虽然很常用,不过,苹果并不鼓励使用,甚至有开发小组对其弊病用自家上线应用前后数据对比进行了抨击。

    QQConfiguration- swift,QQ-iPhone端框架,左侧菜单栏拖动手势。

    SwiftPages- 高可定制类似 Instagram 视图滑动切换功能类库。API 简单、易用。

    FlowingMenu.swift- 菜单如此出场方式(橡皮筋弹跳式动画)好玩又有趣。

    gif动画@

    YLGIFImage-Swift- YLGIFImage-Swift。

    gifu.Swift- gifu.Swift高性能GIF显示类库。

    droptogif- droptogif视频拖拽到应用窗口后自动转换为 GIF 动画(其转换进程动画效果也超赞)。

    JWAnimatedImage.swift- JWAnimatedImage.swift集中了目前主流的 GIF 显示库(如 FLAnimatedImage,Gifu 等)的优点,进行重构,代码短小精悍。而且使用了新的 frame 提取算法。

    SwiftyGif- 高性能 Gif 播放引擎。

    PHImageKit.swift- 出自 Product Hunter 开发小组的带下载、缓存的 GIF 播放组件库。使用简单又方便。

    其他动画@

    popping- popping是一个POP 使用实例工程

    PopMenu- 用POP动画引擎写的Sina微博的Menu菜单。

    Spring- Spring是一个Swift编写的开源库,可简化Swift编写的iOS动画。支持shake、pop、morph、squeeze、wobble、swing、flipX、flipY、fall、squeezeLeft、squeezeRight以及squeezeDown等多种动画形式,用 IBDesignable 让使用者可以在 Xcode 中快速设置动画效果。

    JGTransitionCollectionView- swift,基于集合视图扩展实现完成自动布局及单元项 Flip式动画效果(效果很赞)。组件使用方便、自然(只需设置集合视图数据源的标准方式即可)。

    KYShareMenu- 带弹性动画的分享菜单。

    BuildAnInfiniteCarousel- 自己动手造无限循环图片轮播,教程

    LLCycleScrollView- iOS图片轮播(图片循环播放), 支持文本图片结合,支持图片数据的延时加载,支持StoryBoard,支持本地图片显示及与网络图的混合显示

    tispr-card-stack- swift 卡片风格动画切换组件及完整交互示例。

    ZLSwipeableViewSwift- swift 卡片堆叠效果的实现(ZLSwipeableView)】可实现类似Tinder和Potluck应用程序的卡片堆叠效果,该项目基于ZLSwipeableView objective-c实现。1.自定义动画。2.自定义滑动切换。3.自定义方向。4.撤销。

    Koloda- 基于卡片的 Tinder-style 动画效果示例。精细绝人。更赞的是额外附了详细开发教程 How We Built Tinder-Like Koloda Animation in Swift网页链接。Yalantis 出品动画程序款款精品。

    KDIntroView- swift 动态介绍视图框架及演示。另外两个相似的类库是 RazzleDazzle和 Presentation,择需使用。

    RazzleDazzle- 【IFTTT开源Swift编写的帧动画框架--RazzleDazzle】RazzleDazzle 是IFTTT开源的一个iOS帧动画框架,非常适用于APP初次使用时的介绍和引导信息。JazzHands是UIKit一个简单的关键帧基础动画框架,可通过手势、scrollview、KVO等控制动画,被IFTTT应用在IFTTT for iPhone上。

    SIFloatingCollection_Swift- 可定制的 Apple Music 风格浮动形状动画组件及演示。

    CKWaveCollectionViewTransition- swift, UICollectionViewController之间切换的动画。

    CardsAnimationDemo- swift,《使用 UICollectionView 实现的一个卡片动画》不是直接操作所有 UIView 和 CALayer 的 transform3D 属性来实现整个效果的,而是使用 UICollectionView 来完成所有的视图管理和实现。

    TKRubberIndicator.swift- 一个很不错的 page control。

    TTGEmojiRate.swift- TTGEmojiRate.swift以Emoji表情为基础绘图,Swift开源项目: TTGEmojiRate的实现

    CardAnimation.swift- CardAnimation 是国人开发的一个用 Swift 实现卡片垂直翻转动画的 Demo,实现思路

    CoreAnimationCode.swift- 提供了 "iOS Core Animation Advanced Techniques" 书籍中的代码实例, 方便开发者们进行参考学习。

    UIViewXXYBoom.swift- 一个炫酷好玩的爆炸效果,如何实现这个效果

    ZLSwipeableViewSwift-ZLSwipeableView- ZLSwipeableViewSwift在Tinder and Potluck中的动画效果实现思路(连续卡片翻页效果),最贴心的是作者提供了OC和Swift两个版本来供开发者使用,非常丝滑顺畅的效果。

    RYCuteView- 用UIBezierPath实现果冻效果。教程

    IBAnimatable.swift- 第三方开源库IBAnimatable可以帮助我们在Interface Builder和Swift Playground里面设计UI, 交互, 导航模式, 换场和动画。整个App 都是通过 IBAnimatable 在Interface Builder 设计完成,没有任何一行代码。

    MotionMachine.swift- 功能强大、优雅、模块化动画库。

    circle-menu.swift- 动画效率很赞的圆形缩放菜单演示及类库。

    BWWalkthrough.swift- BWWalkthrough.swift界面切换中加入灵动的动画效果。

    hamburger-button.swift- hamburger-button.swift一个汉堡包动画关闭按钮。

    HamburgerButton.swift- HamburgerButton.swift一个汉堡包动画返回按钮。

    MDCSwipeToChooseView- MDCSwipeToChooseView翻牌子效果。

    Advance.swift- 简单易用、功能强大的动画框架库。在手势交互、帧动画、自定义动画及仿真类型将是不错的选择。

    HWAnimationTransition_SwiftHWAnimationTransition_OC- 类似于格瓦拉启动页中的放大转场动画(objective-C && Swift)。教程

    NumberMorphView.swift- 可爱的数字补间(变身)动画类库。

    DisplaySwitcher.swift- 两个集合视图在不同布局(平铺和列表)间平滑切换。Yalantis 出品。

    DynamicButton.swift- 一套完整、且带动画过渡的图标按钮库。

    TKDotSegment.swift- 是一个带有圆点动画的 segment。

    LiquidLoader.swift- 液态加载动画的轻量级 UI 组件。

    15DaysofAnimationsinSwift- 15DaysofAnimationsinSwift动画。

    Interpolate.swift- 手势驱动交互式转场动画框架库。这个很专业,且非常有意思。

    PeekPop.swift- 3DTouch动画组件。

    fantastic-ios-animation.swift- 基于 UI 组件类别分类,且带精彩动画效果的 iOS 组件库集合。

    GridPanelDemo赞,一个点击翻转的动画Demo

    相册@

    DKImagePickerController相册选取

    AutoLayout@

    Snap- Snap是Masonry Auto Layout DSL的Swift版本,是一款轻量级的布局框架,使用了更良好的语法封装了AutoLayout。Snap支持iOS和OS X。

    Cartography一个很赞的Auto Layout库。

    Neon.swift- 功能强大的 UI 布局神器。

    EasyPeasy.swift- 编程方式自动布局框架库。

    TangramKitTangramKit is a powerful iOS UI framework implemented by Swift. It integrates the functions with Android layout,iOS AutoLayout,SizeClass, HTML CSS float and flexbox and bootstrap. So you can use LinearLayout,RelativeLayout,FrameLayout,TableLayout,FlowLayout,FloatLayout,LayoutSizeClass to build your App 自动布局 UIView UITableView UICollectionView

    网络相关@

    网络连接@

    Alamofire- Alamofire是AFNetworking的作者mattt新写的网络请求的swift库。Alamofire 最佳实践

    SwiftRouter- A URL Router for iOS, written in Swift 2.2?

    AlamofireObjectMapper.swift- 将Alamofire JSON响应数据 转为swift对象。

    RxAlamofire.swift- 为Alamofire提供函数响应式(FRP)调用接口,以优雅的方式使用Alamofire进行网络请求。

    socket.io-client-swift- WebSockect 客户端类库。开放的通讯协议,有利于构建强大地跨平台应用。

    Transporter- swift, 短小、精悍、易用的多文件(并发或顺序)上传和下载传输库。还支持后台运行、传输进程跟踪、暂停/续传/取消/重试控制等功能。

    Just- 小而美的 HTTP 类。功能简单、直接、完整且健壮性高-- swift。

    Future- 基于微框架设计思想的异步执行及结果响应类,代码即简单又干净-- swift。

    HFDownLoad- iOS开发网络篇之文件下载、大文件下载、断点下载:NSData方式、NSURLConnection方式、NSURLSession下载方式下载方式具体的思路、区别见Blog

    Pitaya.swift- Pitaya 是纯 Swift 写的 iOS 网络库,支持 Basic Authorization、SSL 钢钉、HTTP raw body / JSON body、快速文件上传等特性,并通过内置 JSONNeverDie 实现了对 JSON 的完全支持,开箱即用。中文文档

    starscream.swift- starscream.swift:WebSocket客户端类库。

    SwiftNet.swift- 基于 RxSwift 和 Alamofire 的网络请求简易封装库。

    Networking.Swift- 使用简单、功能惊喜,基于 NSURLSession 的网络封装。

    Moya- 对Alamofire的封装,使用枚举将网络层实现细节与页面逻辑代码分离,方便单元测试,支持stub测试,配合RxSwift食用更佳,博客教程

    EFInternetIndicatorswift 轻巧的一款 iOS 网络变更通知工具。

    图像获取@

    Kingfisher- 非常?纯 Swift 实现的类 SDWebImage 库,实现了异步下载和缓存图片。

    KFSwiftImageLoader- Swift,一个图像缓存加载库。

    网络聊天@

    MessageKit.swift- 消息 UI 库 JSQMessagesViewController 的 Swift 版。

    jchat-swift- 一个聊天 App,具有完备的即时通讯功能,JChat 的功能基于极光 JMessage SDK 来开发。

    网络测试@

    Reachability.swift- 用于替换苹果的 Reachability 类,可以方便地检测当前是否联网以及具体的联网状态。

    NetReachability- swift2.0 简单的方法检查网络连接的连通性,提供通知中心集成接口。

    SimpleBS.swift- 网络测试小工具。

    网页框架@

    Perfect.swift- Perfect 致力于 Swift 服务端应用,从打造专业应用服务器开始。Swift服务端编程:Perfect项目上手指南

    swift-http- Swift HTTP Server,又一个 Swift 服务器,最大的亮点是支持 Docker 部署。

    Swifton- Swifton是一个优秀的Swift on Rails 的Web Framework。

    Taylor.swift- Taylor一个swift的轻量级的http服务器的库。

    NetworkObjects.swift- NetworkObjects.swift轻量版HttpServer框架,跨平台解决方案。

    vapor.swift- vapor.swift:swift的服务器库 vapor。

    Kitura.swift- Kitura.swift:安装、使用步骤及文档最为清晰地来自 IBM Swift 开发组的开源 Web 服务器。此外,IBM 云服务 Bluemix 也为 Swift 打开通路。

    网络解析@

    CSV@

    CSwiftV- A csv parser written in swift conforming to rfc4180?

    SwiftCSV- CSV parser for Swift?

    Json@

    SwiftyJSON- The better way to deal with JSON data in Swift.?

    ObjectMapper- 很赞 ObjectMapper 是一个基于 Swift 语言开发的能够让 JSON 与 Object 之间轻易转换的类库。通过 ObjectMapper 我们可以将 JSON 数据转换成 Model 对象或将 Model 对象转换成 JSON 数据。 Simple JSON Object mapping written in Swift

    Decodable- Swift 2 JSON parsing done (more) right?

    Jay- Pure-Swift JSON parser & formatter. Linux & OS X ready.?

    XMLDictionary- ios与mac os平台下xml与NSDictionary相互转化开源类库。

    AEXML.swift- AEXML.swift简单又易于的XML解析类及示例。

    CFRuntime- “Swift 版的 MJExtension,运行时、反射与一键字典模型互转”。

    protobuf-swift- Protocol Buffers 的 Swift 语言实现库。P.S. Protocol Buffers 是 Google 开源项目,主要功能是实现直接序列化结构化的对象数据,方便跨平台快速传递,开发者也可以直接修改 protobuf 中的数据。相比 XML 和 JSON,protobuf 解析更快,存储更小。

    JSONCodable- 基于 Swift 2.0 新特性(Protocol Extensions and Error Handling)的JSON 解析类。

    JSONNeverDie.swift- JSON 到 Model 类的自动映射工具。

    Fuzi.swift- Swift实现的轻量快速的 XML/HTML 解析器。

    SWXMLHash.swift- 易用的 XML 解析类库。非常实用的“轮子”。

    YYModel- 高性能的 iOS JSON 模型框架。

    TidyJSON.swift- TidyJSON.swift一款简单、易用、明了的 JSON 解析小类库。

    PMJSON.swift- PMJSON.swift简单、实用、高效的 JSON 解析类库。

    Unbox.swift- 极为易用、轻量,更少辅助代码的 JSON 解析类。

    Wrap.swift- 方便、易用的对象转 JSON 类库。

    JASON- 高效的Json解析(Swift) Fast JSON parsing for Swift

    JSONCodable- Swift json编码解码三方库 Hassle-free JSON encoding and decoding in Swift

    Coolie- Swift json转model的三方库 Coolie helps you to create models (& their constructors) from JSON file.

    Tailor- 一个非常快和方便的对象映射Swift三方库 A super fast & convenient object mapper tailored for your needs.

    alexander- 一个非常简洁的json处理三方库 An extremely simple JSON helper written in Swift.

    Freddy- 一个可以重用的json解析库 A reusable framework for parsing JSON in Swift.

    mapper- 一个json反序列化库 A JSON deserialization library for Swift

    AlamofireJsonToObjects- 一个将json data转为Swift对象的类扩展 An Alamofire extension which converts JSON response data into swift objects using EVReflection

    Alembic- 功能性的json解析库 Functional JSON parsing, mapping to objects, and serialize to JSON?

    Wrap- The easy to use Swift JSON encoder?

    Arrow- 一个Swift JSON解析库 JSON Parsing Library for Swift

    Genome- 一个易用、多样、安全,包含错误映射的JSON转Model的Swift库. A simple, type safe, failure driven mapping library for serializing JSON to models in Swift 2.0 (Supports Linux)

    XML&HTML@

    Other Parsing@

    二维码@

    LBXScan赞 A barcode and qr code scanner (二维码、扫码、扫一扫、ZXing和ios系统自带扫码封装,扫码界面效果封装)(Objective-C和Swift均支持).

    VR@

    VRDemo-SwiftVRDemo是用Swift配合OpenGL ES实现的360度全景播放器

    开发资料@

    播客@

    学习资料@

    SwiftGuide非常赞 这份指南汇集了Swift语言主流学习资源,并以开发者的视角整理编排。http://dev.swiftguide.cn

    the-swift-programming-language-in-chinese非常赞 中文版 Apple 官方 Swift 教程《The Swift Programming Language》

    iOS-Swift-Demos精心收集并分类整理的Swift开发学习资源,包括Apple官方提供的示例代码和文档,以及github上的项目和国内外开发者的技术博客。欢迎提交pull-request一起维护。[iOS Swift Demos from Apple]http://blog.liulantao.com/SwiftBeginnersGuide/

    Swift 开源项目精选-v1.0- Swift 开源项目精选-v1.0。

    Swift开源项目精选- Swift开源项目精选--推荐,每周都有更新。

    Swift中文指南- 中文版Apple官方Swift教程《The Swift Programming Language》,老码版本历史版本更新说明

    The Swift Programming Language 中文版- The Swift Programming Language 中文版。

    swifttoolbox- swifttoolbox swift开发的开源库汇总。

    SwiftGuide- 这份指南汇集了Swift语言主流学习资源,并以开发者的视角整理编排-- 非常不错,值得推荐。

    Awesome Swift- 一个收集了很多 Swift 开发资源的网站。

    Developing_iOS_8_Apps_With_Swift- Developing iOS 8 Apps with Swift 字幕简体中文翻译项目(斯坦福白胡子老头swift教学视频)。

    Swift-On-iOS- JohnLui 的 Swift On iOS 代码仓库。

    30DaysofSwift- 30DaysofSwift 自学 iOS -三十天三十个 Swift 项目

    MySampleCodeSwift的一些Demo

    他人开源总结@

    awesome-swift- A collaborative list of awesome swift resources. Feel free to contribute!

    awesome-swift- A curated list of awesome Swift frameworks, libraries and software.

    SwiftMarch- 从开发者角度介绍被广泛运用于实际Swift项目中的开源库。

    开发博客列表@

    学习笔记、书籍@

    设计@

    好的文章@

    RxSwift入坑手册- RxSwift入坑手册。

    Xcode使用技巧- SwiftGG 交流分享:Xcode使用技巧。

    Swift编程的15个技巧- Swift编程的15个技巧。

    美工资源@

    开发工具@

    Xcode插件@

    Swimat- Swimat,是一款Xcode 插件,帮你一键格式化 swift 代码。

    XcodeSwiftSnippets- XcodeSwiftSnippets, 提供了很多可在 Xcode 上使用的 Swift 代码片段, 通过自动补全的方式极大的提高了开发效率。

    好用的软件@

    Cagegory@

    测试及调试@

    depcheckSwift 工程分析工具(Dependency analyzer tool for Swift projects)

    CleanroomLogger- 相当于 CocoaLumberjack 或 Log4j 的 Swift 版本,功能上甚至更强大。另外,源代码中已经内含了完整的 API 文档,使用非常方便。

    Quick- 用于Swift中的单元测试(也可用于Objective-C),与Xcode整合在一起。如果你是Objective-C的粉丝,我建议用Specta代替这个,但是对Swift使用者来说,Quick是最佳选择。

    Sleipnir- Swift的测试框架。

    XXPlaceHolder.swift- MMPlaceHolder的swift版本。

    SwiftyBeaver- 一个完善的日志工具,支持彩色输出、输出内容到文件、重要性分级、多输出目标。工具执行在后台,不影响性能,可以极大提高开发效率。

    swiftlog- 为Swift 应用提供快捷添加日志信息的方法,Swift 包管理支持(SPM)、 使用惊艳的 Rainbow 包输出彩色日志、支持写入文件。使用 swiftlog

    Log.swift- 灵活、易用、可定制输出格式和主题风格的日志类(Swift),支持控制台彩色输出。

    Cuckoo.swift- Cuckoo.swift一款用法更接近于传统单元测试 Mock 框架库(区别之处在于需要用脚本预先生成 Mock 类)。

    XCGLogger.swift- XCGLogger.swift功能完整的日志管理类库。

    Peek.swift- 更友好、手势方式检查界面内组件布局信息(相当于浏览器元素检查功能),界面调试利器。

    开发工具@

    FengNiao一个清理Xcode中没使用的资源文件的命令行工具.

    数据存储@

    缓存处理@

    Cache.swift- 一款简单、易用的缓存库。支持 MemoryCache, DiskCache 以及前两项组合的 MultiCache。

    Cache.swift- Nothing but Cache。

    AwesomeCache.swift- Delightful on-disk cache (written in Swift)。

    Track.swift- 基于文件系统和链表的 Cache。分为 Disk 和 Memory,线程安全,支持 LRU 淘汰,性能尚可。

    CoreData@

    JSQCoreDataKit- A swifter Core Data stack?

    数据库@

    RealmIncrementalStore.swift- RealmIncrementalStore.swift:集 Realm 数据库和 CoreData 对象模型两者优势的 Realm 数据库访问类库。

    Breeze- 用Swift写的一个轻量级的CoreData管理工具,并且还支持iCloud 。

    AlecrimCoreData- Swift,更容易地访问 CoreData 对象封装类库。除了 CRUD,还提供指针定位,强大的排序、筛选,异步数据获取,以及独立线程后台存取数据。

    SQLite.swift- 纯swift实现的类型安全的SQLite3封装,数据存储和JSON解析是永恒的话题。

    fluent.swift- 纯swift实现的类型安全的SQLite3封装,数据存储和JSON解析是永恒的话题。

    swiftydb- 是一个第三方 SQLite 工具,能够大大简化数据库操作。如果你不放心 Realm,那就用 SwiftyDB 吧。使用教程demo

    Graph.swift- 设计新颖、使用简单基于 Core Data 的数据驱动框架库 (作者Daniel Dahan)。

    SwiftStore- Key-Value store for Swift backed by LevelDB?

    序列化@

    WebView与WKWebView@

    IOSCallJsOrJsCallIOS- IOSCallJsOrJsCallIOS:利用iOS7.0后出来的JavaScriptCore framework,webview与Js交互是常见的需求。OC版本与swift版本。《OC JavaScriptCore与js交互》,《Swift JavaScriptCore与js交互》

    WKWebViewTestDemo.swift- WKWebViewTestDemo:WKWebView新特性及JS交互,文章讲解

    React.swift- 启发自 React 的纯 Swift 函数版基于 UIKit 封装类库。这种结构是否似曾相识。

    [GRMustache] (https://github.com/groue/GRMustache) 一个类似templateEngine的html渲染工具,可以更加有效的帮助大家完成数据生成HTML的过程。

    FaceBook@

    通讯录@

    PPGetAddressBookSwift- 一行代码获取按A~Z分组精准排序的通讯录联系人 Swift版( 已处理姓名所有字符的排序问题)

    Email@

    PostalA swift framework for working with emails,Postal is a swift framework providing simple access to common email providers.

    三方分享、支付、登录等等@

    其他库@

    SwiftDate- 特别完整、强大的日期时间操作管理类库。它几乎涵盖了已知开源日期类库所有优秀特性。 他能帮你轻松处理时区,处理时间加减,计算到期时间等等场景下的问题。

    SYKeyboardTextField- SYKeyboardTextField 是一个轻巧,简单,非侵入式的键盘附随输入框! 采用Swift编写。

    IQKeyboardManager- 处理键盘事件强大的库,有OC和Swift版本,纯代码、Storyboard和Xib都适用。

    ZFScan- 仿微信 二维码/条形码 扫描。

    QRCodeReader.swift- QRCodeReader.swift一款简单的 QR 二维码阅读组件及示例,提供前后相机切换功能。

    swiftScan- 具有丰富功能的二维码扫描组件及类库。对应OC版本LBXScan

    QR-Code-Generator.swift- 生成二维码。

    Parsimmon- swift,小而美的语言学类库封装工具包。提供分词、标记词性、词形归并、朴素贝页斯分类、决策树等自然语言分析小工具。P.S. 英语分词效果好于中文,感兴趣的同学可以针对中文做一些优化开发。参考译文 NSHipster -NSLinguistic​Tagger

    MKMapView-Extension- 这是关于 MKMapView 写的一个基于swift的扩展,可以扩展 MKMapView 的相关功能,减少复用代码量。

    SwiftValidator- 基于规则的输入验证类库。项目良好的面向对象设计思想,使规则的扩展及自定义非常方便。更专业的规则引擎(甚至是基于自然语言的规则配置)解决方案,比如:开源的 Drools,商用的 ILOG 等。

    Validated.swift- Validated.swift通过值验证或限定,快速定义新类型的微类库(约50行代码)。

    SwiftOCR- 识别字母和数字相较于 Tesseract 有压倒性优势(附图)的 OCR 类库。

    Regex.swift- 实用的正则表达式微框架类库。

    PySwiftyRegex.swift- 像Python一样简洁高效地作正则处理。

    PhoneNumberKit.swift- 解析、格式化及验证国际电话号码工具库(相当于 Google 的 libphonenumber 库的 Swift 版本)。

    BFKit-Swift- BFKit-Swift 这套工具库可以提高应用开发效率。

    SwiftSequence- 简洁、灵活、多变的操作 SequenceType 的类库(基于微框架(μframework)设计思想)。

    IDNFeedParser- 一个简单易用的Rss解析库。

    Swifternalization- 一套实用的本地化工具库。使用教程及 API 文档完整。值得收入项目的“轮子”。

    Localize-Swift- Localize-Swift一款开发者不可或缺的国际化及本地化字符串框架支持类库。同样地,使用简单、直观又方便。

    apous- 一款有趣的 Swift 应用 - 让 Swift 成为脚本语言。

    ControlOrientation- 如何用代码控制以不同屏幕方向打开新页面【iOS】,使用说明

    SwiftyStoreKit- 一款轻量级的 iOS 应用内购买框架。

    Device-swift- 可以非常方便的获取设备型号和屏幕尺寸,实现起来难度不大,大家可以学习一下源码。

    RunKit.swift- 针对 GCD 框架的一个友好访问封装库(支持方法链式调用)。

    Plum-O-Meter- swift 称重应用, (3D Touch之我见)[http://swift.gg/2015/10/23/3d-touch-impressions-and-thoughts/]。

    打开自带地图、百度地图、腾讯地图- 打开自带地图、百度地图、腾讯地图。

    MapManager.swift- MapManager.swift地图及路径管理封装库。

    eviltransform.swift- eviltransform.swift解决国内GPS地图坐标偏移问题,它将政府加密过的GCJ-02坐标,转成世界通用的WGS-84坐标。

    BabyBluetooth- 是一个非常容易使用的蓝牙库, 适用于 iOS 和 Mac OS, 基于原生 CoreBluetooth 框架封装, 可以帮开发者们更简单地使用 CoreBluetooth API, 使用链式方法体, 使得代码更简洁、优雅。iOS蓝牙开发(四):BabyBluetooth蓝牙库介绍

    RxBluetoothKit.swift- 基于 RxSwift 的蓝牙通讯库。

    BluetoothKit.swift- 基于 CoreBluetooth API 实现iOS/OS X 设备间蓝牙通讯封装类库。功能强大、传输稳定,示例完整,很酷。

    CoreDataStack.swift- 存储栈。

    SYNQueue.swift- 执行队列类库。

    DDMathParser.swift- 相比 NSExpression 和 GCMathPaser,功能更强大的数学表达式解析器。

    RateLimit.swift- 简单、实用定时执行任务工具类库。

    shoppingCart.swift- swift的购物车demo,采用纯代码UI,autolayout自动布局,core animation动画效果。

    SwiftyGPIO- 通过 Swift 语言去控制基于 Linux 主板(比如:C.H.I.P. 和 树莓派) 的 GPIO(General Purpose Input Output ),去完成简单的工控功能(比如 LED 灯的显示)。

    Scale.swifty- 简单直观的单位计算及换算类库(支持常用计量类型)。代码简洁性、直观性杠杠的。

    swift-pons- 面向协议的不受长度限制数字类型及数学计算扩充类库。用它做一款最牛科学计算器妥妥地。

    SwiftString- SwiftString:String 扩展功能很丰富(无论格式化杂乱字符串,还是子串查找,亦或是格式转换都很强大)。

    FileBrowser.swift- FileBrowser.swift 一款开源的 iOS 文件浏览器, 支持文件搜索, 文件预览和 3D touch 功能。

    AFBrushBoard.swift- AFBrushBoard.swift基于swift的毛笔画板Demo。包含多阶贝塞尔曲线的抽取、模拟画笔速度等算法。

    SwiftForms- SwiftForms表单递交库,快速开发利器。

    Design-Patterns-In-Swift- Design-Patterns-In-Swift如何使用常用设计模式及示例。

    Dollar.swift- Dollar.swift是一个Swift库,无需扩展任何内置对象就为Swift语言提供有效的函数式编程辅助方法,类似于Lo-Dash或JavaScript中的Underscore。而Cent则是通过扩展功能来扩展Swift中的特定对象类型。

    Underscore.swift- 函数式编程辅助方法,可靠性上压倒目标对手是 Dollar。

    PathKit.swift- PathKit.swift小而美的路径管理类。

    Surge.swift- Surge.swift基于苹果Accelerate高性能计算数学框架封装库。

    Async.swift- Async.swift简洁的后台执行代码的异步封装库。

    AlecrimAsyncKit.swift- 一款很优雅的异步执行框架库。

    BrightFutures.swift- BrightFutures.swift漫长或复杂计算由独立线程异步来完成。

    Euler.swift- Euler.swift直观、简洁的数学表达式∛27÷3+∑[3,1,2]。

    Siren.swift- Siren.swift当应用更新时,通知用户并提供App Store链接。

    BTree.swift- BTree.swift:相对于标准集合类型具有更优执行性能的基于B-Tree的优化集合类型实现类库。

    PromiseKit- 同时支持 Swift 及 Objective-C 的 Promise 类库,异步编程类库 提供了很多实用的异步函数 让异步编程更简单。

    Duration.swift- 测量代码片段执行时间工具类库(Swift)。

    Bolts-Swift- 全平台(所有支持 Swift 的设备)任务管理 futures/promises 异步实现类库。

    BCColor.swift- 轻量而强大的颜色处理库,纯 Swift 版。 支持从图片拾取一套主题色,类似AppleMusic;支持图片黑白化、对颜色的加深和变浅、生成渐变颜色等。

    AIToolbox.swift- AI 主流模块集工具箱库。其中涉及 AI 知识实在广阔又高端。

    EZSwiftExtensions- 对Swift标准库, Foundation, UIKit 提供了很多高级扩展函数。

    TempiBeatDetection.swift- Swift 语言写的音乐节奏节拍检测库。

    Venice.swift- 让 Swift 3 提前支持协程(Coroutine)。P.S. Chris 曾答疑过,Coroutine 不在 Swift 3 支持范围中,将在更晚时候讨论语言级支持。

    FlatBuffersSwift- Swift 版 FlatBuffers 实现类库。P.S. FlatBuffers 是跨平台、高效,提供了 C++/Java 接口的序列化开源工具库。

    Lyft.swift- 一套面向 Lyft 开发者的 Swift API 类库。

    Up-Down.swift- Up-Down.swift:在 OS X 菜单栏上实时显示网络上传和下载速度小工具。

    Algorithm.swift- 算法和概率模型工具集。(作者 Daniel Dahan)

    Spots.swift- 一套为了加速开发效率、将 view models 采用 JSON 格式存储于云端 view controller 框架库。

    PinpointKit.swift- 简单的手势动作快速触发反馈组件。主要功能包含自动截屏、附加说明和日志。支持添加可定制箭头、着重框、文本、模糊打码等常用快照编辑功能。它非常适合开发过程中测试人员反馈缺陷。

    Switcher.swift- 一个 OS X 小 App,可以很轻松地切换 App Store 和 iTunes 的账号,对于同时使用多个 Apple ID 的人来说非常地方便。

    PDF@

    图像浏览及处理@

    ShinpuruImage- Syntactic Sugar for Accelerate/vImage and Core Image Filters?

    core-image-explorer- Core Image 滤镜处理图片-- swift ,Core Image 介绍

    GPUImage2.swift- Swift 版基于 GPU 图像和视频处理框架库。

    TimingFunctionEditor- TimingFunctionEditor用swift编写, 贝塞尔曲线编辑器,编辑后可以预览或拷贝代码片段直接使用。P.S. 该项目采用更简单的依赖管理器。Carthage,而非常用的 CocoaPods。Carthage介绍中文

    AAFaceDetection- AAFaceDetection--swift,简单、实用的面部识别封装库。虽然该技术从 iOS 5 发展,不过真正有趣的应用还不多。

    Concorde- swift, Concorde, 一个可用于下载和解码渐进式 JPEG 的库, 可用来改善应用的用户体验。

    ZoomTransition- swift, 通过手势操控图片的放大、缩小、旋转等自由变化效果的组件及示例。

    AFImageHelper- swift,一套针对 UIImage 和 UIImageView 的实用扩展库,功能包含填色和渐变、裁剪、缩放以及具有缓存机制的在线图片获取。

    PinterestSwift- swift,Pinterest 风格图片缩放、切换示例。

    PhotoStackView-Swift- PhotoStackView——照片叠放视图,使用说明

    MPParallaxView- 是用 Swift 写的类似 Apple TV Parallax 效果的视图。

    SDECollectionViewAlbumTransition- 用自定义的 push 和 pop 实现了有趣的 iOS 相册翻开动画效果。

    SKPhotoBrowser.swift- swift中规中矩、实用的图片浏览类库。示例也很完整。

    LLPhotoBrowser- Swift3图片浏览库,支持网络图,本地图,UIImage同时使用,支持识别二维码,支持横屏看图,支持长按弹出功能窗口

    Nuke.swift- 完整、强大、实用的图片管理类库。主要功能包括可定制装载,缓存,滤镜及尺寸变换。

    PagingView.swift- 注重细节的自动布局分页视图组件。

    DouBanMeinv.swift- 抓取豆瓣美女图片,瀑布流显示。

    SwViewCapture.swift- SwViewCapture.swift一个用起来还不错的iOS截图库.(支持截取所有内容, 适用于所有ScrollView组成的视图, 包括WebView)。

    Filterpedia.swift- 强大的图片滤镜库演示。

    preview-transition.swift- 通过向导式代码实现步骤,实现完整、自然流畅的图片预览及转场功能。

    CartoonEyes.swift- 前置摄像头捕获图像后,采用 Core Image 脸部识别 CIDetector 和漫画效果滤镜复合出卡通效果眼睛。

    图像处理@

    Sharaku类似Instagram的图片滤镜库 Image filtering UI library like Instagram.

    JHFilterDemo图片滤镜生成器

    SnapSliderFilters给图像加贴图、文字的类似阅后即焚的功能

    相机@

    CameraManager- 相机管理封装类库。看着极好用的样子----swift。

    SkfSwiftCammer- 一个相机demo,在oc里面调用了swift。

    音频@

    recordDemo.swift- 一个Swift语言实现直接可以用的录音Demo,实现说明

    Swift-Radio-Pro- 集成 LastFM 的专业电台应用(基于 Swift 2.0)。

    AudioKit.swift- 音频合成、加工及分析平台(支持 iOS、OS X、tvOS)框架库。无论其易用性,还是功能性及专业性。

    多媒体@

    视频@

    mobileplayer-ios.swift- 很不错的高度可定制播放器项目。

    Periscope-VideoViewController.swift- 简洁实用的视频快进、倒带控制视图类库。

    BMPlayer.swift- 基于 AVPlayer 使用 Swift 封装的视频播放器,方便快速集成,支持横屏、竖屏,上下滑动调节音量、屏幕亮度,左右滑动调节播放进度。

    音频@

    AudioBus- 下一代的音频路由 Add Next Generation Live App-to-App Audio Routing.

    AudioKit- 一个非常强大的音频合成、加工、分析平台工具,支持iOS、macOS、tvOS、

    Cephalopod- 一个基于AVIudioPlayer的音效推子,支持 iOS,tvOS和macOS。

    Chirp- 播放和删除声音最容易的方法

    Beethoven- 音高检测大师

    AudioPlayerSwift- 一个使音频播放更简单的类AudioPlayer,支持 iOS, macOS and tvOS apps.

    AudioPlayer- 一个基于AVPlayer的播放本地和网络音频的库

    TuningFork- 简单的调音师

    MusicKit- 一个合成和转换音乐的框架

    TheAmazingAudioEngine2- 一个惊人的、精致的用于音频App的音频库

    InteractivePlayerView- 自定义音乐播放View

    ESTMusicIndicator- 很酷的音乐动画指示View

    SwiftySound一个让你一行代码就可以播放音频的三方库

    消息相关@

    消息推送客户端@

    消息推送服务器端@

    通知相关@

    Homeoff- 用swift写了一个模仿Launcher通知中心快捷方式的应用。支持20个应用,并增加了一个返回到桌面来解放Home键的功能。

    SwiftNotificationCenter- 一个面向协议的类型安全、线程安全、内存安全的通知中心。

    时间日期@

    设计模式@

    版本新API的Demo@

    MTSwift-Learning- 通过一些简单项目实战演练开始学习 Swift 。

    iOS8-day-by-day- swift。

    iOS9-day-by-day- swfitiOS9 Day-by-Day :: Day 2 :: UI Testing

    iOS 9 分屏多任务- iOS 9 分屏多任务:Slide Over & Split View快速入门(中文版)。

    uistackview-sample.swift- iOS 9 引进了 UIStackViews,提供 auto-layout 特性。如果你开发过 Android 应用,会发现它和 LinearLayouts 概念上很类似,它是增强版。你可以手动创建,也可以使用 IB 自动创建,本文用的是代码实现。

    代码安全与密码@

    OAuthSwift- OAuthSwift国外主流网站OAuth授权类库。

    CryptoSwift- swift加密库, 支持md5,sha1,sha224,sha256...。

    动态更新@

    AppleWatch@

    Apple Watch开发教程资料汇总- Apple Watch开发教程资料汇总。

    Stargate- 通过 iPhone 桥接实现 Mac 与 Watch 的即时通讯。Stargate 通过封装两个优秀的基础类库 MMWormhole 和 PeerKit 实现高效的通讯应用。--swift

    soon- 一款倒计时 WatchKit 示例应用。作者从架构的角度,思考如何设计一款完整、通讯高效且性能又好的 WatchKit 扩展应用。

    MMWormhole.swift- MMWormhole.swift:iOS或OS X扩展与宿主应用的通讯框架。

    overlook可以监测目标目录文件改变,执行对应命令的后台及命令行工具 The Judge, Jury and Executioner for the file system.

    VPN@

    vpnon- swift的VPN On 的源码和本地化内容都是开放的:官方网站

    物联网@

    未分类@

    Eureka简洁方便的 iOS 表单生成器 (Swift 3)

    展开全文
  • macOS 开发 - 入门笔记

    2019-07-27 15:13:59
    文章目录 一、引言二、招聘信息三、相关书籍推荐1、《macOS应用开发基础教程》2、... iOS操作系统6、OS X与iOS内核编程7、Mac OS X For Unix Geeks8、OS X系统管理和部署四、视频教程五、实用Demo六、优秀MacOS 开...

    文章目录

    一、引言
    二、招聘信息
    三、相关书籍推荐
    1、《macOS应用开发基础教程》
    2、《Cocoa入门:使用Objective-C》
    3、非虫:《macOS软件安全与逆向分析》
    4、官方开发文档
    5、深入解析Mac OS X & iOS操作系统
    6、OS X与iOS内核编程
    7、Mac OS X For Unix Geeks
    8、OS X系统管理和部署
    四、视频教程
    五、实用Demo
    六、优秀MacOS 开发博客
    七、一些不错的Mac论坛
    Mac 使用&软件下载
    八、一些好用的工具
    png 转 icns
    icons 生成
    九、我的开发笔记(CSDN 博客目录)
    1、基础UI控件
    2、Dock、Window、状态栏、目录栏
    3、文件管理等
    4、视图效果
    5、综合
    6、网络&数据库
    7、证书&打包
    8、命令行
    9、Mac 小技巧
    10、Mac 系统知识
    十、QQ群
    一、引言

    用了三年Mac,非常迷恋这个系统。想尝试写些自己的OS X App , 无奈资质较浅,网上资料并不多。
    尝试搜索 MacOS 开发相关qq群、贴吧,发现常常只有一两个人。
    因此在这里记录下搜集到的一些文章和资料,方便后来的感兴趣的人快捷学习。
    下面资料主要针对已有 OC 基础的开发者,没有 OC 基础的,建议学习基础语法和控件后开始阅读下述材料。

    二、招聘信息

    这里是 macOS 程序员的招聘信息
    https://www.jianshu.com/p/612af04bc456

    https://www.lagou.com/jobs/list_mac ?labelWords=&fromSearch=true&suginput=

    三、相关书籍推荐

    1、《macOS应用开发基础教程》

    纸质版(swift)地址:https://item.jd.com/12417409.html
    电子版(oc&swift)地址:http://www.macdev.io

    书的内容还挺全面,买书后加入qq群,群主和几个资深开发人士会为你解答很多问题,总的来说,书费80元不亏,省钱省时省力。
    本人也从作者 剑指人心 这里学到很多东西,所以良心推荐。

    2、《Cocoa入门:使用Objective-C》

    pdf下载地址:http://download.csdn.net/detail/lovechris00/9854323
    对本书翻译的相关博客:http://blog.sina.com.cn/s/articlelist_1576524975_0_1.html
    个人说明:书籍比较陈旧,但知识体系齐全,适合入门参考。

    3、非虫:《macOS软件安全与逆向分析》

    这本书就讲的比较深入了,不建议初学者学习;有底层需求的同学后续可以阅读。

    介绍:https://zhuanlan.zhihu.com/p/28008458
    章节试读:https://github.com/feicong/macbook

    4、官方开发文档

    https://developer.apple.com/library/content/documentation/General/Conceptual/MOSXAppProgrammingGuide/Introduction/Introduction.html

    5、深入解析Mac OS X & iOS操作系统

    https://download.csdn.net/download/conghuoshu4927/10307556

    6、OS X与iOS内核编程

    https://download.csdn.net/download/zhangyutangde/10201936

    7、Mac OS X For Unix Geeks

    8、OS X系统管理和部署

    四、视频教程

    1、macOS开发从入门到精通(199元)
    https://i.xue.taobao.com/detail.htm?spm=a2174.7765247.0.0.Q5FIrn&courseId=100614

    2、Harry Ng 的 (英文)教程:
    http://www.jianshu.com/p/c79ff411e983

    3、代码行者的
    http://www.jianshu.com/p/764bd7a4970e

    4、Mac OSX 开发基础教程
    http://study.163.com/course/introduction/1004170018.htm

    5、macOS 应用开发进阶课
    http://study.163.com/course/introduction/1005042030.htm

    6、Mac精仿QQ实战课程
    https://edu.csdn.net/course/detail/7033

    7、AppleProgramming
    https://www.youtube.com/user/AppleProgramming/videos

    8、Cocoa Tutorials
    https://www.youtube.com/playlist?list=PLE83F832121568D36

    五、实用Demo

    带图片效果的 demo 集合
    有点类似 code4app
    https://www.cocoacontrols.com/controls?platform_id=mac-os-x

    Apple Open Source
    https://opensource.apple.com

    一些优秀开源项目
    https://github.com/iCHAIT/awesome-macOS

    Wanglei 关于基本控件的使用:
    https://github.com/GitHubWanglei/macOS_AppKit_Demo

    lianxu 搜集的 cocoachina 上的优质 demo
    http://lianxu.me/code/

    部分优质 github 用户demos
    https://github.com/venj/Cocoa-blog-code
    https://github.com/venj?tab=repositories
    https://github.com/sjitech
    https://github.com/yuedong56
    https://github.com/sindresorhus

    六、优秀MacOS 开发博客

    悲观患者,分享mac开发达30篇文章
    http://www.jianshu.com/u/ff347dd2364d

    不在犯二的IT男
    http://blog.csdn.net/lengshengren/article/category/6642427

    谭颢
    http://www.tanhao.me

    lianxu
    http://lianxu.me/
    别被前面的英文吓到,后面都是中文。

    森亮号航海见识:分类:Cocoa
    http://see.sl088.com/wiki/分类:Cocoa

    venj
    https://www.venj.me

    我的MacOS 开发简书文集:
    这里是我搜集的简书上关于 macOS 开发的文章
    http://www.jianshu.com/c/299375a4887f

    afatgoat的博客
    https://blog.csdn.net/cneducation

    啃芝士
    一个很不错的IT知识科普自媒体
    https://www.kenzhishi.com/replay

    Bruce :《Mac系统的日常使用技巧 》系列
    https://www.xiebruce.top/category/mac

    七、一些不错的Mac论坛

    这些论坛混合Mac 的开发,和常用软件下载、使用技巧。

    https://macosx.com

    cocoachina
    http://www.cocoachina.com

    V2EX
    https://www.v2ex.com

    Learn Cocoa
    http://cocoadevcentral.com

    Mac志
    https://www.isofts.org

    cocoawithlove (国外)
    http://www.cocoawithlove.com/archive/

    Grivet-Tools
    http://www.grivet-tools.com/blog/page/2/

    MacRumors
    https://forums.macrumors.com/forums/mac-programming.73/

    Mac 使用&软件下载

    MacGG:Mac 使用攻略
    https://www.macgg.com

    知乎专栏:Mac小技巧(马可菠萝)
    https://zhuanlan.zhihu.com/p/36383162

    Mac毒:Mac 使用技巧 & Mac 软件
    https://author.baidu.com/home/1583497111996425?from=dusite_artdetailh5

    利器
    http://liqi.io/sponsorship/

    麦克叉
    https://www.macx.cn

    简洁的看API 的网站
    https://developer.xamarin.com/api/root/monomac-lib/

    八、一些好用的工具

    png 转 icns

    下载地址:
    http://www.cocoachina.com/bbs/read.php?tid=113763

    icons 生成

    介绍、下载地址
    http://www.cocoachina.com/bbs/read.php?tid=290247

    九、我的开发笔记(CSDN 博客目录)

    这里是我根据网上找的文章和 demo,进行的一个较为系统的介绍,还在更新,代码主要为 OC。

    我的 MacOS 开发入门笔记目录:
    http://blog.csdn.net/lovechris00/article/category/6942446

    1、基础UI控件

    | macOS 开发 - Lable

    | macOS 开发 - NSTextView

    | macOS 开发 - NSTextField 使用 attributedStringValue

    | macOS 开发 - NSView 添加鼠标监控

    | macOS 开发 - NSTextField

    | macOS 开发 - NSVisualEffectView

    | macOS AppKit文档翻译 - NSImage

    | macOS 开发 - NSImageView

    | macOS 开发 - 系统图片

    | macOS 开发 - NSImge格式转换/压缩(CIImage/CGImageRef/NSData)

    | macOS 开发 - NSButton

    | macOS 开发 - NSBezelStyle & NSButton(配图)

    | macOS 上的 NSCell(比较 NSButton 和 NSButtonCell )

    | macOS 开发 - NSButtonType

    | macOS 开发 - NSButton - 勾选框(NSButtonTypeSwitch)

    | macOS 开发 - NSTableView (纯代码)

    | macOS 开发 - NSTabView

    | macOS 开发 - NSAlert

    | macOS 开发 - NSStepper

    | macOS 开发 - NSSplitView

    | macOS 开发 - NSSlider

    | macOS 开发 - NSSegmentedControl

    | macOS 开发 - NSPopover

    | macOS 开发 - NSComboBox

    | macOS 开发 - NSCollectionView & CNGridView

    | macOS 开发- NSBox

    | macOS 开发 - NSParagraphStyle

    | macOS 开发 - NSProgressIndicator

    2、Dock、Window、状态栏、目录栏

    | macOS 开发 - NSWindow 的创建和跳转

    | macOS 开发 - NSWindow 自定义样式

    | macOS 开发 - NSWindow、NSWindowController、NSViewController 的关系和创建

    | macOS 开发 - NSMenu 添加菜单栏

    | macOS 开发 - NSStatusBar & NSStatusItem(状态栏)

    | macOS 开发 - 窗口的关闭、重启

    | macOS - NSDockTile设置Dock图标上的小红点

    3、文件管理等

    | macOS 开发 - FSEventStream(文件系统改变事件监控)

    | macOS 开发 - NSWorkspace

    | macOS 开发 - NSFileWrapper

    | macOS 开发 - 添加 Document Type (注册文件打开方式)

    | macOS 开发 - 压缩 zip

    4、视图效果

    | macOS 开发 - NSGradient

    | macOS 开发 - isFlipped(坐标系)

    | macOS 开发 - CGColor

    | macOS 开发 - CGImageSource

    | macOS 开发 - 画图与 iOS 的几点细节区别

    5、综合

    | macOS 给自己的 app 添加 URL Scheme

    | macOS 开发 - 计算代码行数

    | macOS 开发 - NSTask(调用命令行、APP 多开)

    | macOS 开发 - 修改工程名

    | macOS 开发 - 使用 safari 打开Mac应用

    | macOS 开发 - 添加 Document Type

    | macOS 选择照片、相机拍照(步骤详解配demo下载)

    | macOS 开发 - NSDatePicker(日期选择)

    | macOS 开发 - NSColorPanel & NSFontManager 选择颜色、字体

    | macOS 开发 - NSUserNotification

    | macOS 开发 - EventKit、EKReminder、EKCalendar(日历、提醒事项)

    | macOS 开发 - 保存 EKEvent 到日历失败 No calendar has been set.

    | macOS 开发 - NSPasteboard

    | macOS 开发 - 使用 ScreenSaverView 制作屏幕保护程序

    | macOS 开发 - 守护进程 Daemon

    | macOS 开发 - ServiceManagement

    | macOS 开发 - 使用 LaunchAgents 实现开机自启动

    | Spotlight

    | 使用 Ono 报错:Use of '@import' when C++ modules are disabled, consider using -fmodules and -fcxx-modul

    | macOS 开发 - App Delegate 与storyboard、xib

    | macOS - 使用 Sparkle 进行自更新

    | macOS - 手动修改本地app的icon

    | macOS 开发 - USB Prober

    | macOS 开发 - 添加可执行程序 Command Line Tool

    | iOS & macOS 导入/导出 Excel 数据

    | macOS 开发 - 使用 safari 打开Mac应用

    | QuickLook 插件

    | UIApplication 对象

    | macOS 开发 - 修改工程名

    | macOS 开发 - BRLOptionParser

    6、网络&数据库

    | macOS 开发 - 使用AFN

    | macOS - 搭建本地服务器

    | iOS & macOS 导入/导出 Excel 数据

    | macOS 开发 - 使用 route.h 报错 (Darwin.net.route)

    | macOS 开发 - 代码实现ping : SimplePing 的使用

    | macOS 开发 - 网络请求 PAC Fetch failed with error NSPOSIXErrorDomain:1

    | macOS 开发- 使用 CFNetDiagnosticCopyNetworkStatusPassively 判断网络连接状态

    | macOS 开发 - 使用 CNCopySupportedInterfaces 获取 WiFi ssid

    | macOS 开发 - CoreWlan 获取 WiFi 信息 (CWInterface、CWChannel、CWConfiguration)

    7、证书&打包

    | macOS 开发 - 证书

    | macOS 开发 - 打包 PKG

    | macOS 开发 - 给 PKG 签名(productsign)

    | macOS 开发 - 生成 dmg 文件 (步骤详解配图)

    | macOS 开发 - Provisioning profile “xxx” doesn’t support the Network Extensions capability.

    | macOS 开发 - 使用 Packages 打包失败:“build failed”

    | macOS 开发 - Developer ID Application 和 Developer ID Installer 证书

    | macOS 开发 - NSMicrophoneUsageDescription (10.14 mojave 权限问题)

    | macOS 开发 - DiskImageMounter

    | macOS 开发 - 错误代码 -36 (拖拽 app 到应用程序时)

    | macOS 开发 - 无可装载的文件系统 image not recognized

    | macOS 开发 - 描述文件安装失败 Provisioning profile does not allow this device.

    | iOS 开发 - 证书 Not In Keychain / Missing private key for signing certificate(需要安装 p12 文件)

    8、命令行

    | macOS 开发 - 运行命令行

    | Mac 命令 - systemsetup

    | macOS - networksetup 命令

    | Mac - otool

    | macOS - security 命令

    | Xcode - 使用 dyld 环境变量进行调试

    | macOS - lsappinfo 命令

    9、Mac 小技巧

    | Mac 使用小技巧 - 开篇

    | Mac 使用小技巧 - 设置文件默认打开方式

    | macOS 开发 - 使用 fluid 将网页转为 Mac 应用

    | mac 软件 - POSTGRESQL 数据库安装、使用、GUI工具

    | mac 软件 - 安装MySQL

    | Mac - icns 转 png/jpg

    | macOS - POSTGRESQL 数据库安装、使用、GUI工具

    | mac 软件 - Pycharm 安装、破解、使用、快捷键

    | Mac下Brackets安装Emmet、Beauty插件详解

    | mac下搭建Go语言开发环境详解(步骤配图)

    | macOS - 安装 TensorFlow

    | macOS 工具 - 数据库 Sequel Pro 使用

    | macOS - 搭建本地服务器

    10、Mac 系统知识

    | macOS、iOS、Darwin、类 unix、POSIX

    | kernel_task

    十、QQ群

    这里是我创建的 qq 群,希望能够把搜集的资料在群里分享,也分享技术和经验。感兴趣的可以加进来。

    群号:644096295
    你也用手机QQ可以扫描二维码加入

     

    在 Mac 的开发过程中,你会欣喜的发现 iOS 的开发知识也可以用得上;
    但更深入的时候,发现没有中文资料,外文资料也是寥寥无几;有时是从一些晦涩的外文文章中拼拼凑凑出一些思路来 —— 这个过程就像开荒。不要害怕,让我们一起征战吧!


    ---------------------
    原文:https://blog.csdn.net/lovechris00/article/details/72779076

    转载于:https://www.cnblogs.com/gaozhang12345/p/10818557.html

    展开全文
  • 基于Swift 开源项目精选导图,以应用架构角度出发继续甄选并“精分”。筛选、介定方法更偏重于构建应用时,项目在分类中起到的作用权重,可持续性权重,并部分算上开发者影响力。尝试持续地完善一份不那么杂乱无章...

    基于Swift 开源项目精选导图,以应用架构角度出发继续甄选并“精分”。筛选、介定方法更偏重于构建应用时,项目在分类中起到的作用权重,可持续性权重,并部分算上开发者影响力。尝试持续地完善一份不那么杂乱无章(也许还比较好用)的 Swift 开源子集。内容将依然以导图和 myMindNode 形式呈现(持续更新中……)

    myMindNode浏览及导图原文档下载……

    附:MindNode 格式导图导出的文本内容(浏览 PDF 版本


    Learning & Advanced

    <algorithms> raywenderlich/swift-algorithm-club ➟ Swift Playgrounds

    Swift 算法俱乐部,最全、最活跃,最具学习价值的算法库。

    <useful Swift snippets> elizabethsiegle/30-seconds-of-swift-code ➟ Swift Playgrounds

    精选的 30 秒或更短时间即能理解的实用 Swift 代码片段。(高效学习 swift 语言语法利器。思路来源于 知名 JavaScript 项目 github.com/30-seconds/…

    <video series & programming> pointfreeco/episode-code-samples ➟ Swift Playgrounds

    专注于学习 Swift 编程的视频聊天系列。

    <livestreams, videos and sessions> insidegui/WWDC ➟ macOS

    WWDC 现场、视频及相关资源汇集应用(非官方)

    <ARCL framework> ProjectDent/ARKit-CoreLocation ➟ iOS

    AR 与 GPS 精确数据的结合,开始一次导航之旅。非常重要的实验性项目,未来开发前景可期。

    <Swift for Tensorflow> tensorflow/swift ➟ macOS | Linux

    集成使用 TensorFlow 专用版 Swift

    ……

    Developer Tools

    XCTest

    <testing framework> Quick/Quick & Quick/Nimble ➟ iOS | macOS

    单元测试框架库

    <snapshot testing> pointfreeco/swift-snapshot-testing ➟ iOS | macOS

    通过快照记录方式进行自动化测试。非常直观方便的一种方式。

    <code generator> mac-cain13/R.swift ➟ macOS

    常用资源(images,fonts, ,colors 等)通过更易用的强类型方式在 Xcode 编辑器输入并自动转换。

    <Code Diagnostics> realm/SwiftLint ➟ macOS

    Realm 采用 Swift 编写的基于 GitHub's Swift Style Guide 规则的检查及转换工具。除了命令行运行方式,也提供集成 Xcode 的方法。对于新团队,这样的工具可以自动约束大家遵循编程规范。

    <design & prototype> IBAnimatable/IBAnimatable ➟ iOS | macOS

    IBAnimatable 是一个帮助我们在 Interface Builder 和 Swift Playground 里面设计 UI, 交互, 导航模式, 换场和动画的开源库。 github.com/IBAnimatabl…

    <App Store Connect API> AvdLee/appstoreconnect-swift-sdk ➟ macOS

    “借助 App Store Connect API 实现工作流程自动化”,这个库是对整套工作流程 Swift 版的易用化封装。 REST API:https://developer.apple.com/documentati… APP STORE CONNECT 使用入门(官方中、英、日文版)help.apple.com/app-store-c…

    Package Manager

    <Package Manager> apple/swift-package-manager ➟ macOS

    苹果官方 Swift 包管理

    <dependency manager> Carthage/Carthage ➟ macOS

    简单,去中心化库依赖管理框架。 入门指南:www.raywenderlich.com/416-carthag…

    <Git Hooks> orta/Komondor ➟ macOS

    在 Swift 项目中支持 Git hooks。 配置实例:github.com/orta/Komond…

    Programming Framework ➟ iOS | macOS | watchOS | Linux

    <Reactive Programming> ReactiveX/RxSwift

    简单、高效,活泼的函数反应式编程框架。
    何为反应式编程?面向数据流和变化传播(时间和事件非代码顺序)的编程范式。

    <Promises> mxcl/PromiseKit

    Promise 的 Swift 实现类库,简化异步编程代码实现。 RxSwift vs PromiseKit blog.dianqk.org/2016/08/22/…

    <state management> ReSwift/ReSwift

    该框架主要针对单页面应用状态及单向数据流管理。

    ……

    Server ➟ macOS | Linux

    <web framework> vapor/vapor

    最活跃的 Web 服务器框架。
    推荐理由:纯 Swift 开发,引导开发者采用简洁、干净的 Swift 语法。
    主要缺点:牺牲部分性能换取未使用 C 语言基础库为代价

    Vapor, Perfect, Kitura 比较:www.jianshu.com/p/a9ca47e84…

    <web framework> PerfectlySoft/Perfect

    功能更强大,性能更好的 Web 服务器框架。有完整的中文开发文档支持。
    github.com/PerfectlySo…

    <web framework and HTTP server> IBM-Swift/Kitura

    与 IBM Bluemix 最佳云集成,功能强大的 Web 服务器框架。CGI 支持。

    <Swift on ARM + Docker> helje5/dockSwiftOnARM ➟ Shell

    将 Swift 编译运行于 ARM 平台 Docker 上。

    ……

    Application ➟ iOS | macOS | watchOS

    App Services

    Cache

    • <cache> hyperoslo/Cache ➟ iOS | macOS | watchOS

      多类型数据混合缓存库。

    • <UserDefaults wrapper> radex/SwiftyUserDefaults ➟ iOS | macOS

      轻量级数据存储类 NSUserDefaults 扩展类,它使类型数据访问和存储更为便捷、直观。

    Social API

    • <facebook SDK> facebook/facebook-sdk-swift ➟ iOS

    • <Twitter SDK> twitter/twitter-kit-ios ➟ iOS

    editor

    • <integration with your app> coteditor/CotEditor ➟ macOS

      轻量,但功能一点也不轻量的 App Store 上架的开源文本编辑器(几乎支持所有主流格式语法高亮显示,且可以扩展及自定义)

    Markdown

    • <cmark> iwasrobbed/Down ➟ iOS | macOS

      集成调用 cmark 的高性能 Markdown 渲染实现库及演示。支持多种输出式(Web View, HTML, XML, LaTeX 等)也许是性能外加可用性最高的一个版本了。

    • <WKWebView> keitaoouchi/MarkdownView ➟ iOS

      Markdown 文档预览视图组件。

    • <WKWebView> tophat/RichTextView ➟ iOS

      兼具主流格式解析(LaTeX, HTML, Markdown)及简单视频嵌入(YouTube/Vimeo)功能富文本浏览视图。

    ePub

    • <reader & framework for ePub> FolioReader/FolioReaderKit ➟ iOS

      ePub 阅读器及解析框架类库。这个很震撼,开发者还同步提供 Android 版。

    Database & Client

    • <mobile database> realm/realm-cocoa ➟ iOS | macOS | watchOS

      可以匹敌甚至替代 Core Data 和 SQLite 的移动数据库。

    • <sync Realm with CloudKit> caiyue1993/IceCream ➟ iOS | macOS | watchOS

      用 CloudKit 同步 Realm 数据库工具库。

    FileProvider & CloudKit

    • <files> nvzqz/FileKit ➟ iOS | macOS | watchOS

      简单、接口友好的文件管理类库。

    • <local file, iCloud & remote> amosavian/FileProvider ➟ iOS | macOS

      提供了一套完整、实用,接口统一的本地及远程文件管理封装器实现 Local, iCloud and Remote (WebDAV/FTP/Dropbox/OneDrive)。

    Core ML

    • <utilities> hollance/CoreMLHelpers ➟ iOS

      一些输入/输出类型转换和扩展,以便于更容易地去使用 CoreML 。

    • <running trained-model Inception-v3> hollance/Inception-CoreML ➟ iOS

      Inception-v3 运行在 CoreML 框架内

    • <using Watson Visual Recognition> watson-developer-cloud/visual-recognition-coreml ➟ iOS

      来自 IBM Watson 的视觉识别及机器学习示例。 使用 Watson Swift SDK 管理和执行定制的训练模型。

    • <trained using CreateML> lovoo/NSFWDetector ➟ iOS

      用 CoreML 扫描、过滤不雅图片。

    System

    Networking

    • <HTTP networking> Alamofire/Alamofire ➟ iOS | watchOS | macOS

      著名的 AFNetworking 络基础库 Swift 语言版。

    • <network abstraction layer> Moya/Moya ➟ iOS | watchOS | macOS

      为你提供一套干净的网络抽象层,以以区隔底层网络库。

    • <Apple Reachability replacement> ashleymills/Reachability.swift ➟ iOS | macOS

      检测网络连通性实用工具库。

    • <WebSocket client> daltoniam/Starscream ➟ iOS | macOS

      WebSocket 标准(RFC 6455)客户端库 Swift 实现。

    <RxSwift + Bluetooth> Polidea/RxBluetoothKit ➟ iOS | macOS

    基于 RxSwift 框架的蓝牙库。

    <LocalAuthentication> rushisangani/BiometricAuthentication ➟ iOS | macOS

    针对 Face ID 和 Touch ID 更简洁地封装使用。

    Graphics and Games

    ARKit

    • <usable practices> simformsolutions/ARKit2.0-Prototype ➟ iOS

      AR 2.0 实现效果原型演示

    • <ARKit + GPS data> ProjectDent/ARKit-CoreLocation ➟ iOS

      AR 与 GPS 精确数据的结合,开始一次导航之旅。其中包括了 ARKit + CoreLocation 框架库 ARCL,它是非常重要的实验性项目,未来开发前景可期。

    • <referenced cases> olucurious/Awesome-ARKit ➟ iOS

      AR 开源项目汇总列表。

    Core Graphics

    • <image processing> gavinbunney/Toucan ➟ iOS | macOS

      小而美的图片变换及处理类。

    • <size of PNG, GIF, JPEG, BMP> malcommac/ImageSizeFetcher ➟ iOS | macOS | watchOS

      通过 URL 获取图像类型或尺寸。

    • <dominant & prominent colors> jathu/UIImageColors ➟ iOS

      图片色系决定界面背景色及字体显示颜色。获取主色、次色、背景色、详细色

    Image I/O

    • <parse & play GIF> kaishin/gifu ➟ iOS

      高性能 GIF 显示类库

    • <parse & play APNG> onevcat/APNGKit ➟ iOS

      解析和显示 APNG 的框架

    • <play GIF & APNG> wangjwchn/AImage ➟ iOS

      GIF/APNG 播放引擎。

    • <SVG parser> mchoe/SwiftSVG ➟ iOS | macOS

      支持多种接口绘制 SVG 类库。

    UIKit & AppKit

    View and Controls

    • <Form> xmartlabs/Eureka ➟ iOS

      “由XMARTLABS精心编写,是XLForm的Swift版本。”github.com/xmartlabs/E…

    • <folding paper card> Ramotion/folding-cell ➟ iOS

      自然流畅、清新的单元格可折叠视图及演示库。

    • <Image> onevcat/Kingfisher ➟ iOS | macOS

      轻量级下载、缓存网络图像视图库。

    • <Charts> danielgindi/Charts ➟ iOS | macOS

      Android 图表开源库 MPAndroidChart 的 Swift 版。相当于在 Apple 的跨平台版本。

    • <modal segue> SwiftKickMobile/SwiftMessages ➟ iOS

      高可定制信息弹窗组件

    • <Calendar> patchthecode/JTAppleCalendar ➟ iOS

      功能强大、高可定制日历组件。

    • <UILabel morphing> lexrus/LTMorphingLabel ➟ iOS

      特赞的文字飘入飘出效果。

    • <skeleton loading> Juanpe/SkeletonView ➟ iOS

      等待加载信息前,预先优雅的显示内容骨架。

    • <UITextFields> raulriera/TextFieldEffects ➟ iOS

      定制的不同风格 UITextFields 输入框。

    • <UINavigationController> andreamazz/AMScrollingNavbar ➟ iOS

      可滚动的(显示或隐藏 UINavigationBar

    View Layout

    • <Autolayout> SnapKit/SnapKit ➟ iOS | macOS

      自动布局 DSL 框架库。 snapkit.io/docs/

    Animations

    • <animations framework> timdonnelly/Advance ➟ iOS | macOS

      一款高阶仿真动画框架库。

    • <animations> MengTo/Spring ➟ iOS

      精简版动画库(并附动画功能展示和调试功能)。

    • <loading & animations> ninjaprox/NVActivityIndicatorView ➟ iOS

      酷炫的装载动画库及演示。满足你对装载动画的个性化需求。

    • <transition> HeroTransitions/Hero ➟ iOS

      类似于 Keynote 的 Magic Move 的 transition 库。极为易用、支持自动布局。

    • <transition> marcosgriselli/ViewAnimator ➟ iOS

      简单的代码实现复杂 UI 布局及动画切换。

    IoT ➟ Ubuntu | Raspain

    <Swift on ARM devices> uraimo/buildSwiftOnARM ➟ Shell

    <hardward projects> uraimo/SwiftyGPIO ➟ Linux

    通过 Swift 语言去控制基于 Linux/ARM 主板(比如:C.H.I.P. 和 树莓派) 的 GPIO(General Purpose Input Output ),去完成简单的工控功能(比如 LED 灯的显示)。

    ……

    Foundation ➟ iOS | macOS | watchOS | Linux

    Utility

    <extensions> SwifterSwift/SwifterSwift

    一套超过 500 个本地库扩展的生产力工具库。

    <JSON parser> SwiftyJSON/SwiftyJSON

    GitHub 上最为开发者认可的 JSON 解析库。

    <JSON parser & object mapping> tristanhimmelman/ObjectMapper

    简介:对象与JSON互转实用类库。 推荐理由:面向对象模型,易于开发集成。有更完善的与 Alamofire 的集成方案。

    <Date> malcommac/SwiftDate

    几乎涵盖了已知开源日期类库所有优秀特性

    <file paths> kylef/PathKit

    极易用的文件路径操作类库

    Security

    <cryptographic algorithms> krzyzanowskim/CryptoSwift

    Crypto 算法及相关功能类库集合

    <Keychain Services wrapper> kishikawakatsumi/KeychainAccess

    钥匙串存储管理封装

    Database & Client

    <SQLite> stephencelis/SQLite.swift

    简单、轻量,使用上最 SQL 的 SQLite 封装库。

    Networking Framework

    <event-driven network framework> apple/swift-nio

    事件驱动网络应用框架。

    <SwiftNIO-based server-side> amzn/smoke-framework

    事件驱动网络应用框架。

    GitHub

    <GitHub client API> nerdishbynature/octokit.swift

    同时支持 GitHub 和 GitHub 企业版 Swift API 客户端类库。

    Cognitive Computing

    <IBM Watson> watson-developer-cloud/swift-sdk ➟ iOS | Linux

    让开发者在自己的应用内快速应用 IBM Watson Cognitive Computing 服务。

    ……

    Database Server

    (cross platform)

    ➟ Shell

    <Realm Platform> realm/realm-object-server

    Realm 平台目标实现可交互的移动数据库

    ……

    iCloud & Remote

    (iCloud, On-drive, Dropbox, Webdav, ftp/ftps, Samba...)

    IBM Watson Services

    (AI)

    TensorFlow

    (pre-trained model)

    <TensorFlow to CoreML Converter> tf-coreml/tf-coreml ➟ Python

    Caffe

    (Neural networks model)


    整理过程中八卦过的两位传奇人物:

    1. GitHub 上曾经最具影响力的 iOS 独立博主及开发者 Mattt 就曾于 2015年加入苹果后,几乎消声匿迹(无论在其个人网站、博客、 GitHub 社区还是 Twitter 都少有活动,原因又鲜为人知)。很多不太了解开发者多诧异他怎么了?大部分人都是在 Mattt 本人在 Twitter 上于2018年3月再次发声后,才知道他过去三年原来一直为苹果工作(做为一位资深技术作者为 The Swift Programming Language,Swift Package Manager 和 swift.org 等写开发文档)。并且,回归社区后的活跃度显示爆发式增加,并开辟了一个新的领域( Swift 基础教育系列课程项目 Flight School)。当然,奠定其“江湖”地位的几款知名开源项目的后续,也基本不用担心未来发展。
    1. 此外,Swift “教父” Chris Lattner 于 2016 年下半年后在开源社区贡献大幅度减少,自从 2017年初闪电离职苹果公司,短暂加入特斯拉担任自动驾驶(Tesla Autopilot)项目软件副总裁,由于工作性质变更,Swift 及 开源社区贡献更加稀少。可喜的是不到六个月后即又离职特斯拉,并迅速加入了谷歌大脑(Google Brain)项目组,负责推动 TensorFlow 平台开发者体验及接入Swift 语言基础构架工作等工作后,逐渐恢复了开源社区活跃度及贡献。目前看来,他不会轻易地撒手不管 Swift 语言的发展、建设。这一点对于热衷于 iOS 开发和开源项目的同学们都是很大的鼓舞。 坦率地讲,以上内容只是在整理过程中,闲着无聊顺便“八卦”解闷,也可以认为纯粹凑字数。?
    展开全文
  • 问题 1:我能否写一个 Swift 函数用于查找在任意数组中存储的任意类型的任何实例对象的位置\索引。 问题 2:我能否写一个 Swift 函数用于确定在任意数组中存储的任意类型的任何实例对象的类型。 我所说的 “任何...

    原文链接

    问题 1:我能否写一个 Swift 函数用于查找在任意数组中存储的任意类型的任何实例对象的位置\索引。
    问题 2:我能否写一个 Swift 函数用于确定在任意数组中存储的任意类型的任何实例对象的类型。

    我所说的 “任何类型”,包括自定义类型,比如我们自己定义的 Class 类型。提示:我知道我能够用 Swift Array 类型的内置方法,如 index 和 contains,但今天我将会用简单代码实例来说明 Swift 泛型中的一些特性。
    一般来说,我将泛型编程作如下定义:

    • … a style of computer programming in which algorithms are written in terms of types to-be-specified-later that are then instantiated when needed for specific types provided as parameters. This approach, pioneered by ML in 1973, permits writing common functions or types that differ only in the set of types on which they operate when used, thus reducing duplication.
    • 是一种算法机制为 types to-be-specified-later (类型确定滞后)的计算机编程风格,当具体的类型作为参数传入后,该算法机制会对类型进行实例化。这个方法由 “ML” 在 1973 年开创。可以用共有的函数和类型来表示一个类型集合从而来减少函数操作的重复。

    特别的指出,来自苹果Swift文档 关于”泛型”话题的说明:

    • Generic code enables you to write flexible, reusable functions and types that can work with any type, subject to requirements that you define. You can write code that avoids duplication and expresses its intent in a clear, abstracted manner.
      Generics are one of the most powerful features of Swift , and much of the Swift standard library is built with generic code. … For example, Swift ’s Array and Dictionary types are both generic collections. You can create an array that holds Int values, or an array that holds String values, or indeed an array for any other type that can be created in Swift . Similarly, you can create a dictionary to store values of any specified type, and there are no limitations on what that type can be. …
    • 泛型编码能让你写出符合需求、支持任意类型,灵活、可重用的函数。你能够编写避免重复和编程风格抽象、清晰、优雅的代码。
      泛型是 Swift 中最强大的特性之一,大量的 Swift 标准库使用了泛型编码。例如, Swift 的数组和字典都是泛型集合。你可以创建一个存有整型值或者字符串值的数组,有必要的话,还可以创建一个任何 Swift 支持类型的数组。类似的,你也可以创建一个字典用于存储任意指定类型的值。

    我一直提倡构建可复用,简洁,可维护的代码,对于 Swift 中的泛型,如果运用恰当,能某种程度上帮助我实现上面提到的效果。所以对于上面两个问题,我的答案是 “YES”。

    生活在一个特定类型编码的世界


    让我们写一个 Swift 的方法来说明在一个字符串数组中是否存在特定的一个字符串:

    func existsManual(item:String, inArray:[String]) -> Bool
    {
        var index:Int = 0
        var found = false
    
        while (index < inArray.count && found == false)
        {
            if item == inArray[index]
            {
                found = true
            }
            else
            {
                index = index + 1
            }
        }
    
        if found
        {
            return true
        }
        else
        {
            return false
        }
    }

    让我们测试这个方法:

    let strings = ["Ishmael", "Jacob", "Ezekiel"]
    
    let nameExistsInArray = existsManual(item: "Ishmael", inArray: strings)
    // returns true
    
    let nameExistsInArray1 = existsManual(item: "Bubba", inArray: strings)
    // returns false

    在创建了用于查找 String 数组的 existsManual 函数后。假如我决定想要一些类似的函数用于搜索 Integer,Float,和 Double 数组 — 甚至用于查找数组中自定义类呢?我最终花费了宝贵的时间写了很多做同样事情的函数。我需要写很多代码来实现。如果我发现了一个新的/更快的搜索算法呢?又如果在我的搜索算法有一个 bug 呢?我不得不改变我所有的查找方法的版本。我发现这简直是个复用地狱:

    func existsManual(item:String, inArray:[String]) -> Bool
    ...
    func existsManual(item:Int, inArray:[Int]) -> Bool
    ...
    func existsManual(item:Float, inArray:[Float]) -> Bool
    ...
    func existsManual(item:Double, inArray:[Double]) -> Bool
    ...
    //  "Person"  is a custom class we'll create
    //  "Person" 是我们将要创建的自定义的类
    func existsManual(item:Person, inArray:[Person]) -> Bool

    问题


    我们已经厌烦了活在一个处理类型的世界里,不得不为每个我们想要查找的数组类型创建新的方法。终究这给我们带来了大量的技术负债。由于现代软件难以置信的复杂性,像你我这样的开发者需要使用更好地实践,更好的技术,更好的方法,用我们的神经元最大程度的控制这种混乱。据估计 Window 7 包含大约 4 千万行代码而 macOS 10.4 (Tiger) 包含大约 8.5 千万行代码,预估像这样的系统潜在行为次数都是不可能的。

    泛型的解决之道


    (再次紧记学习泛型的目的,我们依旧假设 Swift 的数组类型的内置的函数,index 和 contains ,不存在。)
    让我们先尝试写这样一个 Swift 函数,判断 Swift 的标准类型(例如 String,Integer,Float 或 Double)的一个特定实例是否存在于这个 Swift 标准类型的数组中。怎么做呢?
    让我们切换到 Swift 泛型,特别是泛型函数,类型参数,类型约束以及 Equatable 协议。在没有定义任何术语前,我写了一些代码,思考一下你看到的。

    func exists<T: Equatable>(item: T, inArray: [T]) -> Bool
    {
        var index:Int = 0
        var found = false
    
        while (index < inArray.count && found == false)
        {
            if item == inArray[index]
            {
                found = true
            }
            else
            {
                index = index + 1
            }
        }
    
        if found
        {
            return true
        }
        else
        {
            return false
        }
    }

    让我们测试下我新写的泛型方法

    let myFriends:[String] = ["John", "Dave", "Jim"]
    
    let isOneOfMyFriends = exists(item: "Dave", inArray: myFriends)
    // returns true
    
    let isOneOfMyFriends1 = exists(item: "Laura", inArray: myFriends)
    // returns false
    
    let myNumbers:[Int] = [1,2,3,4,5,6]
    
    let isOneOfMyNumbers = exists(item: 3, inArray: myNumbers)
    // returns true
    
    let isOneOfMyNumbers1 = exists(item: 0, inArray: myNumbers)
    // returns false
    
    let myNumbersFloat:[Float] = [1.0,2.0,3.0,4.0,5.0,6.0,]
    
    let isOneOfMyFloatNumbers = exists(item: 3.0000, inArray: myNumbersFloat)
    // returns true

    我新写 exists 方法是一个泛型函数,这个方法“能正常工作在任何参数类型上”,此外,让我们看看它的函数签名。

    func exists<T: Equatable >(item: T, inArray: [T]) -> Bool

    我们看到 那个 函数使用一个占位符类型名字(名叫 T, 在这个案例)而不是真正的类型名(比如:Int,Stirng,或 Double)占位符类型名没有指定 T 必须是什么,但他说明了 [item] 和 [inArray] 必须是相同的类型 T 无论 T 代表什么,每当 [exists(::)] 函数被调用时,真实的类型用于替代 T 被确定下来。
    这个 exists 函数中的占位符类型 T 被称为类型参数:

    • 它指定和命名了占位符的类型,直接写在函数名称的后面,在一对尖括号之间(比如 )。
      一旦你指定一个类型参数你可以用它来定义函数参数的类型(比如:[item] and [inArray] [exists(::) 函数)或者作为函数返回值的类型,在任何条件下,当函数被调用的时候类型参数会被真实类型替代。

    为了强化我们目前已经学到的,下面是一个 Swift 函数,该函数能够找到存储在数组中任何类型实例的索引。

    func find<T: Equatable>(item: T, inArray: [T]) -> Int?
    {
        var index:Int = 0
        var found = false
    
        while (index < inArray.count && found == false)
        {
            if item == inArray[index]
            {
                found = true
            }
            else
            {
                index = index + 1
            }
        }
    
        if found
        {
            return index
        }
        else
        {
            return nil
        }
    }

    让我们测试下它

    let myFriends:[String] = ["John", "Dave", "Jim", "Arthur", "Lancelot"]
    
    let findIndexOfFriend = find(item: "John", inArray: myFriends)
    // returns 0
    
    let findIndexOfFriend1 = find(item: "Arthur", inArray: myFriends)
    // returns 3
    
    let findIndexOfFriend2 = find(item: "Guinevere", inArray: myFriends)
    // returns nil

    关于 Equatable 协议


    exists 函数中 标注是什么呢?它叫做类型约束,它规定了”那个类型参数必须继承自一个具体的类,或者遵守一个特定的协议或是协议组合。我指定了 exists 函数参数,item: T 和 inArray: [T], 必须是类型 T, 而类型 T 必须遵守协议 Equatable 协议,为什么是这样的呢?
    所有的 Swift 内置类型已经被构建支持 Equatable 协议。来自 Apple docs: “遵守 Equatable 协议的类型进行相等比较,使用等于运算符(==)判断相等,或者使用不等运算符(!=)判断不等”。这就是为什么我的泛型函数 “exists” 能够在 Swift 的类型(如 String,Integer,Float 和 Double)上正常工作。所有这些类型都定义了 == 和 != 运算符。

    自定义类型和泛型


    假如我声明了一个新的类叫做 “BasicPerson” 如下所示。我能用我的 exists” 函数来找出在数组中是否有 “BasicPerson” 类的一个实例的类型么?不行!为什么不行?看看下面这个代码,我们接下来讨论它:

    class BasicPerson
    {
        var name: String
        var weight: Int
        var sex: String
    
        init(weight: Int, name: String, sex: String)
        {
            self.name = name
            self.weight = weight
            self.sex = sex
        }
    }
    
    let Jim = BasicPerson(weight: 180, name: "Jim Patterson", sex: "M")
    let Sam = BasicPerson(weight: 120, name: "Sam Patterson", sex: "F")
    let Sara = BasicPerson(weight: 115, name: "Sara Lewis", sex: "F")
    
    let basicPersons = [Jim, Sam, Sara]
    
    let isSamABasicPerson = exists(item: Sam, inArray: basicPersons)

    看到最后一行,因为它有一个编译错误:

    error: in argument type '[BasicPerson]', 'BasicPerson' does not conform to expected type 'Equatable'
    let isSamABasicPerson = exists(item: Sam, inArray: basicPersons)

    错误

    这很糟糕了, 在 “BasicPerson” 类型的数组里面,你不能使用 Swift 数组的内建函数 index 和 contains。(你必须定义一个闭包,每当你想使用那两个方法 blah,blah,blah… 这个我就不提了。)
    再次回到问题,为什么报错?
    因为 “BasicPerson” 类没有遵守 Equeatable 协议(这是一个提示,请看下文咯)

    遵守 Equatable 协议


    为了允许我的 “BasicPerson” 类是可以使用我的 “exists” 和 “find” 泛型方法,所有我需要做的是:
    - 让类遵守 Equatable 协议
    - 重载类实例的 == 操作符
    注意这个“Swift 标准库为所有遵循 Euqatable 协议的类型提供了不等于(!=) 操作符的实现。通过调用自定义的 == 函数获取它的取反结果。
    如果你对操作符重载不熟悉,我建议你阅读这些主题,链接在这里这里.相信我,你会想知道操作符重载的。

    • 提示:我重命名 “BasicPerson” 类为 “Person” 让他们在相同的 Swift Playground 文件能共存,接着我们来到 “Person” 类。

    我将实现 == 操作符,所以它能比较 “Person” 类不同实例间的 “name”, “weight”, 和 “sex” 属性。如果两个 “Person” 类的实例有相同的的三个属性。则他们是相等的。如果有一个属性不同,则他们是不相等的(!=)。这就是为什么我的 “Person” 类遵守了 Equatable 协议:

    lass Person: Equatable 
    {
        var name:String
        var weight:Int
        var sex:String
    
        init(weight: Int, name: String, sex: String)
        {
            self.name = name
            self.weight = weight
            self.sex = sex
        }
    
        static func == (lhs: Person, rhs: Person) -> Bool
        {
            if lhs.weight == rhs.weight &&
                lhs.name == rhs.name &&
                lhs.sex == rhs.sex
            {
                return true
            }
            else
            {
                return false
            }
        }
    }

    注意上面的 == 重载方法,这需要让 “Person” 遵守 Equatable 协议。注意 == 重载方法中的 lhs 和 rhs 参数。这是通用的,当重载操作符时,代码中等号两边的对象应该与参数中的物理位置一致,如:

    lhs == rhs
    left-hand side == right-hand side

    它实用吗?


    如果你跟随着我的指南,你能创建像我写的 “exists” 和 “find” 泛型函数用于任何你创建的新类型,如类或者结构体。让你自定义的类和结构体集合类型遵守 Equatable 协议,像 Swift 里面 Array 中的内置函数 index 和 contains。他们确实有用:

    let Joe = Person(weight: 180, name: "Joe Patterson", sex: "M")
    let Pam = Person(weight: 120, name: "Pam Patterson", sex: "F")
    let Sue = Person(weight: 115, name: "Sue Lewis", sex: "F")
    let Jeb = Person(weight: 180, name: "Jeb Patterson", sex: "M")
    let Bob = Person(weight: 200, name: "Bob Smith", sex: "M")
    
    let myPeople:Array = [Joe, Pam, Sue, Jeb]
    
    let indexOfOneOfMyPeople = find(item: Jeb, inArray: myPeople)
    // returns 3 from custom generic function
    // 返回 3 源自自定义泛型函数
    
    let indexOfOneOfMyPeople1 = myPeople.index(of: Jeb)
    // returns 3 from built-in Swift member function
    // 返回 3 源自 Swift 内建成员函数
    
    let isSueOneOfMyPeople = exists(item: Sue, inArray: myPeople)
    // returns true from custom generic function
    // 返回 true 源自自定义泛型函数
    
    let isSueOneOfMyPeople1 = myPeople.contains(Sue)
    // returns true from built-in Swift member function
    // 返回 true 源自 Swift 内建成员函数
    
    let indexOfBob = find(item: Bob, inArray: myPeople)
    // returns nil from custom generic function
    // 返回 nil 源自自定义泛型函数
    
    let indexOfBob1 = myPeople.index(of: Bob)
    // returns nil from built-in Swift member function
    // 返回 nil 源自 Swift 内建成员函数
    
    let isBobOneOfMyPeople1 = exists(item: Bob, inArray: myPeople)
    // returns false from custom generic function
    // 返回 false 源自自定义泛型函数
    
    let isBobOneOfMyPeople2 = myPeople.contains(Bob)
    // returns false from built-in Swift member function
    // 返回 false 源自 Swift 内建成员函数
    
    if Joe == Pam
    {
        print("they're equal")
    }
    else
    {
        print("they're not equal")
    }
    // returns "they're not equal"

    扩展阅读


    苹果提示关于 Equatable 协议的更多好处:

    • Adding Equatable conformance to your custom types means that you can use more convenient APIs when searching for particular instances in a collection. Equatable is also the base protocol for the Hashable and Comparable protocols, which allow more uses of your custom type, such as constructing sets or sorting the elements of a collection.
    • 让你的自定义类型遵循 Equatable 协议意味着你可以使用许多系统提供的 API 来让你在一个集合里面查找特定一个实例变得更加方便。
      Equatable 协议也是 Hashable 协议和 Comparable 协议的基础协议。这允许你使用更多的自定义类型,比如构建集合或者排序集合中的元素。

    比如,如果你遵守了 comparable 协议,你能重载和使用 <,>,<= 和 >= 操作符,这真的很 Cool。

    须知


    想一下我们的 “Person” 类,假如我们有一些类似下文所示的实例:

    let Joe = Person(weight: 180, name: "Joe Patterson", sex: "M")
    let Pam = Person(weight: 120, name: "Pam Patterson", sex: "F")
    let Sue = Person(weight: 115, name: "Sue Lewis", sex: "F")
    let Jeb = Person(weight: 180, name: "Jeb Patterson", sex: "M")
    let Bob = Person(weight: 200, name: "Bob Smith", sex: "M")
    let Jan = Person(weight: 115, name: "Sue Lewis", sex: "F")
    
    if Jan == Sue
    {
        print("they're equal")
    }
    else
    {
        print("they're not equal")
    }
    // returns "they're equal" for 2 different objects
    // 返回 "they're equal" 对于两个不同的对象

    看最后一行,因为这些 “Person” 对象中 “Jan” 和 “Sue” 对象是绝对相等的。即使他们是两个不同的实例对象。你的软件好坏仅仅取决于你的设计。在数据库的术语体系里, “Person” 类集合中,你会需要一个”主键” — 或许在类的设计中,可以添加一个索引变量。比如一个社会安全码、或者你熟知的其他的唯一值来保证 “Person” 类实例在集合 (Array) 中的唯一性,当然啦,你也可以使用 === 操作符。

    展开全文
  • 本文翻译自 What’s New in Swift 3.1? 好消息好消息:Xcode 8.3 和 Swift 3.1 正式版的发布包含了等待已久的 Swift 包管理器 功能,以及对语言本身的改进。 如果你没有一直密切关注 Swift Evolution ...
  • ios_swift开发资源整理

    2015-08-12 20:24:33
    iOS Swift开发资源整理 文档管理者:PMST 当前版本:V1.1.0 最后更新日期:2015.06.28(ps:这兴起事情有点多更新有点少) 注:[New]表示更新内容,此外有优秀文章、资源、框架等等,都可以推荐给我,发送到我的...
  • SWIFT 简史

    2019-07-12 01:27:32
    1:“在 2014 年度 Apple 全球开发者大会上,Apple 推出了现代编程语言 Swift,可为 iOS 和 macOS 编写 app。Apple 现在有了包括 watchOS 和 tvOS 在内的新平台,这些平台也使用 Swift 作为主要编程语言。 自 20 ...
  • 每年的WWDC都是全球苹果开发者的一次大狂欢,今年的WWDC也一样,不过狂欢的主题之一则是:Xcode 8.0 Beta的发布和Swift 3. 0的引入。到底带来了那些变化和惊喜呢?笔者给你细细道来。 一、安装环境的变化 ...
  • Vapor 是一个基于纯 Swift 构建出的 Web 开发框架,目前可以运行在 macOS 和 Ubuntu ,用于构建出漂亮易用的网站或者 API 服务。官方称是用的最多的 Swift web 框架,理由是因其在 IBM Swift Package CatalogBETA - ...
  • Aria2D是用于macOS的简单Aria2 GUI。  aria2是一种轻量级的多协议和多源,跨平台下载... 本机macOS客户端(swift5)  捷径  完整的aria2下载选项  自动启动aria2c  多服务器支持  完整的通知  暗模式
  • 本文摘自:https://www.jianshu.com/p/15c7b3711005 经过验证,这几个不存在: CleanMyMac、OmniGraffle,我将可用的放在云盘里,有需要的话,可以从这里获取: ... ...给大家推荐两个我经常去的破解程序下载...
  • 一段轻快的旋律里,小鸡、外星人、猴子和机器人的 Animoji,表情伴随着「boom boom boom」次第炸开,简单线条勾勒出了繁复的数字世界。随后,一段短片记录了形形色色的开发者们,在夜深人静万籁俱寂的时刻,潜心敲击...
  • 就把征战已久的古董pro挖出,硬生生升到了macOS Sierrra,跑起了 Xcode 8 ,写起了swift。 先来一波实用干货。 swift 闭包项目的实际应用,和objective-c 的 Block 类似。HttpTool 工具类import UIKitclass ...
  • Python实战社群Java实战社群长按识别下方二维码,按需求添加扫码关注添加客服进Python社群▲扫码关注添加客服进Java社群▲作者丨阿里文娱高级无线开发工程师 大斗来源 | In...
  • 因图片比较多,可在我博客查看原文:https://ihtcboy.com/2018/07/15/2018-07-15_%E7%A8%8B%E5%BA%8F%E5%91%98%E7%9A%84macOS%E7%B3%BB%E5%88%97%EF%BC%9A%E7%B2%BE%E9%80%89MacApp/ 1...
  • 本文翻译自 raywenderlich.com 的 macOS 开发经典入门教程,已咨询对方网站,可至多翻译 10 篇文章。翻译它只是因为宿舍太吵太热,只有这样才能一句一句看完,并作为自己的笔记,希望各位有英语阅读能力的话,还是去...
  • 开启了自动运行的同学,经常遇到被卡在running那边死活运行不动的情况,这其实是Xcode的一个bug,苹果修复了好久了...这里给大家介绍一个非常实用的方法: 1.右边改成macOS 2.import的UIKit改成Foundation 以上。 ...
1 2 3 4 5 ... 20
收藏数 456
精华内容 182
热门标签