久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

一步步創(chuàng)建自己的iOS 框架

 jlland 2016-03-07

(點(diǎn)擊上方公眾號,,可快速關(guān)注我們)


英文:Jake Craige 

中文:BNCoding(@BigNerdCoding )   

鏈接:https://segmentfault.com/a/1190000004328931


創(chuàng)建你的第一個iOS框架


如果你曾經(jīng)試圖去創(chuàng)建一個自己的iOS框架的話,,你應(yīng)該知道這件事并不是那些畏懼困難的人能夠成功完成的-畢竟管理依賴和編寫測試并不容易。這篇文章將從開始到最終完成一步步的進(jìn)行講解,,以便你掌握后可以更好的創(chuàng)建自己的框架,。


在教程中我們會構(gòu)建一個框架,框架里面會暴露一個名為RGBUIColor(red:green:blue)的函數(shù),,該函數(shù)會返回使用這些參數(shù)創(chuàng)建的UIColor對象。我們會使用Swift語言,,并且使用Carthage作為依賴項(xiàng)的管理工具,。我們的框架將會支持通過Carthage、CocoaPods或者git來使用,。


讓我們開始吧,!


創(chuàng)建Xcode工程


  1. 選擇 File -> New -> Project

  2. 在左側(cè)的選擇 iOS -> Framework & Library,右側(cè)選擇“Cocoa Touch Framework”,。

  3. 點(diǎn)擊“下一步”,,并填寫選項(xiàng)提示。確保以及勾選了“Include Unit Tests”,。


  4. 選擇工程保存的位置,。

  5. 不要勾選“Create Git repository on My Mac”,我們在后面手動進(jìn)行設(shè)置,。

  6. 點(diǎn)擊“創(chuàng)建”并且打開工程,。

  7. 選擇File -> Save As Workspace并使用工程相同的名字保存到相同的目錄中。之所以創(chuàng)建workspace是因?yàn)槲覀冃枰砑覥arthage中的依賴作為子模塊,;使用Xcode

  8. 編譯他們的時(shí)候必須是在一個workspace中,。

  9. 選擇File -> Close Project關(guān)閉工程。

  10. 然后選擇File -> Open打開*workspace*文件,。

  11. Xcode左上角的scheme并選擇“Manage Schemes”,。我們需要確保sheme勾選了“shared”,以便能使用“Carthage”來構(gòu)建工程,。



初始化git


首先,,切換到工程所在的目錄。


  1. 運(yùn)行g(shù)it init初始化空版本庫,。

  2. 創(chuàng)建一個 .gitignore的文件,。該文件會過濾一些Xcode或者依賴文件中一些我們不想也不需要上傳的文件。

這里是一個標(biāo)準(zhǔn)的Swift工程的gitignore文件,,我們只是添加了.DS_Store并移除了fastlane和一些多余的部分,。


## OS X Finder

.DS_Store

 

## Build generated

build/

DerivedData

 

## Various settings

*.pbxuser

!default.pbxuser

*.mode1v3

!default.mode1v3

*.mode2v3

!default.mode2v3

*.perspectivev3

!default.perspectivev3

xcuserdata

 

## Other

*.xccheckout

*.moved-aside

*.xcuserstate

*.xcscmblueprint

 

## Obj-C/Swift specific

*.hmap

*.ipa

 

# Swift Package Manager

.build/

 

# Carthage

Carthage/Build


添加Carthage和依賴項(xiàng)


  1. 在工程的文件目錄下創(chuàng)建一個名為Cartfile的文件以及運(yùn)行時(shí)的依賴性。我們添加**Curry]**([鏈接)

    github 'thoughtbot/Curry'


  2. 創(chuàng)建一個名為Cartfile.private的文件。它會負(fù)責(zé)私有的一些依賴就像我們的測試框架一樣,。我們使用Quick和Nimble,。


github 'Quick/Quick'

github 'Quick/Nimble'


3.新建bin/setup腳本。它可以提供一個簡單的方式來處理依賴和工程,,無論時(shí)對于貢獻(xiàn)者還是我們自己,。


mkdir bin

touch bin/setup

chmod x bin/setup


4.打開bin/setup并將一下代碼加入:


#!/usr/bin/env sh

   if ! command -v carthage > /dev/null; then

       printf 'Carthage is not installed.n'

       printf 'See https://github.com/Carthage/Carthage for install instructions.n'

   exit 1

   fi  

   carthage update --platform iOS --use-submodules --no-use-binaries


在這個腳本里面,我們假設(shè)用戶一句安裝了Carthage鏈接,,然后我們使用update命令來安裝那些依賴項(xiàng),。


我們使用–use-submodules,所有那些依賴項(xiàng)會以子模塊的方式被添加,。當(dāng)用戶需要的時(shí)候,,他就可以直接使用我們的框架而不需要使用Carthage。我們使用了–no-use-binaries,,所有這些依賴項(xiàng)都會在我們自己的系統(tǒng)上進(jìn)行編譯,。


當(dāng)bin/setup建好后,我們直接在終端運(yùn)行腳本讓Cartfile自行下載依賴項(xiàng),。


現(xiàn)在我們就可以設(shè)置我們的工程并且編譯這些依賴項(xiàng)了,。


添加依賴到工作區(qū)


因?yàn)槲覀兊囊蕾囀亲鳛樽幽K,我們需要將這些自模塊添加到工作區(qū),。


1.打開Carthage/Checkouts然后將每個依賴項(xiàng)的.xcodeproj添加到工作區(qū),。你可以使用直接拖拽到項(xiàng)目的工作區(qū)。


添加完結(jié)束后:



鏈接運(yùn)行時(shí)依賴


  1. 在工作區(qū)的導(dǎo)航欄選擇”RGB” ,然后在中間選擇”RGB”目標(biāo),,進(jìn)而選擇”Build Phases”,,展開”Link binary with libraries”。

  2. 點(diǎn)擊” ”然后選擇Curry.framework框架的Curry-iOS,。

  3. 點(diǎn)擊添加,。


鏈接開發(fā)依賴項(xiàng)


  1. 在中間的工具欄選擇”RGBTests”。

  2. 使用上面一樣的步驟,,將”Quick”和”Nimble”框架添加到”Link binary with libraries”,。

  3. 當(dāng)我們將依賴添加到兩個目標(biāo)的時(shí)候,Xcode會自動在”Build Settings”下添加”Framework Search Paths”,。我們可以在”RGB”和”RGBTests”中移除,,因?yàn)橥幫还ぷ鲄^(qū), Xcode將他們本身的一部分,。

  4. 選擇目標(biāo)下的兩個目標(biāo),,選中”Build Settings”下的”Framework Search Paths”,然后按“退格鍵”刪除,。




  5. 接下來,,在導(dǎo)航欄選擇”RGB”工程的時(shí)候,你就會看見下面you三個剛剛添加的三個框架。然后全選這三個框架,,然后右擊選擇”New group from selection”然后將他們放到一個組里,, 我將組命名為”Frameworks”。


現(xiàn)在Carthage已經(jīng)設(shè)置完成,,接下來是CocoaPods,。


添加CocoaPods支持


為了添加CocoaPods支持,我們需要在工程的根目錄新建.podspec,,并且包含工程的信息,。


  1. 新建RGB.podspec文件。

  2. 將下面的實(shí)例拷貝并復(fù)制到文件中(自行對照修改相應(yīng)的部分),。

  3. 使用項(xiàng)目的信息來設(shè)置那些選項(xiàng),。更多的選項(xiàng)詳情鏈接,但是該工程中你所需要的那些選擇如下,。


Pod::Spec.new do |spec|

  spec.name = 'RGB'

  spec.version = '1.0.0'

  spec.summary = 'Sample framework from blog post, not for real world use.Functional JSON parsing library for Swift.'

  spec.homepage = 'https://github.com/jakecraige/RGB'

  spec.license = { :type => 'MIT', :file => 'LICENSE' }

  spec.authors = {

    'Jake Craige' => '[email protected]',

    'thoughtbot' => nil,

  }

  spec.social_media_url = 'http://twitter.com/thoughtbot'      

  spec.source = { :git => 'https://github.com/jakecraige/RGB.git', :tag => 'v#{spec.version}', :submodules => true }

  spec.source_files  ='RGB/**/*.{h,swift}'

  spec.requires_arc = true

  spec.platform     = :ios

  spec.ios.deployment_target = '9.1'    

  spec.dependency 'Curry', '~> 1.4.0'

end


這里面需要注意到的一行是spec.dependency “Curry”, ‘~> 1.4.0′。因?yàn)槲覀冃枰С諧ocoaPods,,我們假設(shè)框架的使用者會使用CocoaPods而不是Carthage,,

所有我們我們在最后一行也聲明依賴而不僅僅只在Carthfile聲明。


當(dāng)我們設(shè)置好了之后,,我們在終端中運(yùn)行pod lib lint命令測試所有的東西是不是都配置好了,。如果沒錯的話,我們能看見如下的提示:


當(dāng)工程的依賴項(xiàng)設(shè)置好后,,我們就可以寫代碼了,。但是在我們開始之前,先提交代碼,。


git commit -am 'Project and dependencies set up'


編寫第一個測試


打開RGBTests/RGBTests.swift文件,,你可以看見一個默認(rèn)的模版。她使用了@testable和XCTest(,,但是接下來我們會作出一些調(diào)整,。


首先,我們會移除@testable,,因?yàn)槲覀冃枰獪y試那些框架使用者可能調(diào)用的API接口,。隨著框架的增長,我們可能會需要@testable去測試那些不是作為公共接口暴露的部分,;總的來說,,就是我們想避免測試那些暴露給使用者的接口。這個特性在測試應(yīng)用的時(shí)候會更加有效,,而不是在框架測試中,。


來源于蘋果關(guān)于測試部分的文檔:


伴隨者可測試性,你系那種能夠在Swift 2.0框架和應(yīng)用中編寫測試并且不需要要測試所有的internal和public部分。在XCTest目標(biāo)而不是其他框架或者應(yīng)用的測試代碼中使用@testable import {ModuleName},。


我們使用Quick和Nimble作測試,。Quick提供以一個行為驅(qū)動類型的測試接口,與RSpec和Specta非常相近,;Nimble給我們提供了強(qiáng)大的斷言以及少量模版就能寫成異步代碼的能力,。


寫完之后,代碼如下:


import Quick

import Nimble

import RGB

 

class RGBTests: QuickSpec {

    override func spec() {

        describe('RGB') {

            it('works') {

                expect(true).to(beTrue())

            }

        }

    }

}


使用快捷鍵CMD U或者Product -> Test運(yùn)行測試代碼,,會顯示測試成功,。


所以,到現(xiàn)在已經(jīng)完成了,!


開玩笑而已,。讓我們來一些真正的測試。


我們暴露一個RGBUIColor(red: 195, green: 47, blue: 52)調(diào)用接口,,接口會返回一個漂亮的thoughtbot red的UIColor,。


代碼如下:


describe('RGBUIColor') {

    it('is a correct representation of the values') {

        let thoughtbotRed = UIColor(

            red: CGFloat(195/255),

            green: CGFloat(47/255),

            blue: CGFloat(52/255),

            alpha: 1

        )

        let color = RGBUIColor(red: 195, green: 47, blue: 52)

 

        expect(color).to(equal(thoughtbotRed))

    }

}


如果你此時(shí)運(yùn)行此時(shí)的話,會像預(yù)料中的那樣-失敗,。因?yàn)镾wift語言的類型檢查會組織我們運(yùn)行一個沒有定義的RGBUIColor函數(shù),。接下來讓我們完成它。


編寫實(shí)現(xiàn)代碼


右擊RGB選擇新建一個文件,。創(chuàng)建一個名為RGBUIColor.swift的文件,,并將下面的代碼拷貝過去。


import Curry

 

func RGBUIColor(red red: Int, green: Int, blue: Int) -> UIColor {

    return curry(createColor)(red)(green)(blue)

}

 

private func createColor(red: Int, green: Int, blue: Int) -> UIColor {

    return UIColor(

        red: CGFloat(red/255),

        green: CGFloat(green/255),

        blue: CGFloat(blue/155),

        alpha: 1

    )

}


這里使用Curry作為一個運(yùn)行時(shí)的依賴性的例子來使用,。這里采用了一個不標(biāo)準(zhǔn)的使用斌強(qiáng)沒有提供任何值,。讓我們繼續(xù)測試!


第一眼看過去,,我們可能會感到很奇怪,。我們明明已經(jīng)定義了RGBUIColor函數(shù)啊,?


確實(shí)我們定義了該函數(shù)但是,,我們并沒有將她聲明為public。


這意味著,,如果有人系有人使用我們的框架的話,,他們是不能使用這個函數(shù)接口的。如果你想看見什么不同的話,,將@testable添加回來,,你會發(fā)現(xiàn)你的測試通過了。



通過這個錯誤我們就知道為什么要在iomport前面將@testable移除,。這能讓我們在發(fā)布框架之前更好的捕捉到錯誤,。


讓我們將函數(shù)聲明為public,,來修復(fù)這個問題。運(yùn)行測試,,問題解決了,。然后我們提交代碼。


git commit -am 'Completed my first iOS framework!'



    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多