可復用的swift代碼段怎披。為什么用英文做標題盛龄?為了突出“復用”
文章的目的:記錄經(jīng)常使用的代碼塊方便復用
更新次數(shù):將會不定期持續(xù)更新
內(nèi)容來源:有些是從優(yōu)秀開源代碼中摘要的,有些是自己寫的。在此不多做說明。
文章權(quán)限:歡迎收藏轉(zhuǎn)載隘擎,但請勿用于商業(yè)用途
一定程度上說,編寫代碼是一件重復性很高的工作凉夯。當然我并不是說寫出優(yōu)質(zhì)的代碼是一件容易的事情货葬,相反我想表達的是我們在大多數(shù)情況下會重復以前開發(fā)過的內(nèi)容。所以代碼的復用就顯得尤為重要劲够。說到這里我不得不分享一下震桶,最近看到的一篇關于面向?qū)ο笤O計原則的文章。雖然是以Android為描述語言再沧,但思路是相通的不耽誤學習尼夺。
面向?qū)ο蟮?個基本原則:
- 1尊残、單一職責原則:一個類中應該是一組相關性很高的函數(shù)炒瘸、數(shù)據(jù)的封裝。
- 2寝衫、開閉原則:簡單的說就是顷扩,一個類只對擴展開放,對修改關閉慰毅。
- 3隘截、里氏替換原則:所有引用基類的地方必須能透明地使用其子類的對象,簡單的說就是父類能夠使用的地方子類一定能夠使用汹胃。
- 4婶芭、接口隔離原則:客戶端不應該依賴它不需要的接口∽偶ⅲ可以理解為一個方法中應該避免過多的接口依賴犀农。
- 5、依賴倒置原則:模塊間的依賴通過抽象發(fā)生宰掉,實現(xiàn)類之間不發(fā)生直接的依賴關系呵哨,其依賴關系是通過接口或抽象類產(chǎn)生的。既面向接口編程轨奄,或者面向抽象類編程挨务。
- 6谎柄、迪米特原則:也叫最少知識原則果漾。意思是,一個對象應該對其他對象有最少的了解绒障。可以理解為捍歪,一連串的相關處理事件應該抽離封裝出來户辱。對于調(diào)用這個封裝函數(shù)的調(diào)用者变逃,封裝代碼內(nèi)部邏輯是透明的凰棉。 以上六點是java面向?qū)ο蟮脑瓌t福压。其他語言應該也是適用的。
如果感興趣可以查看原文:面向?qū)ο蟮牧鶄€基本原則
好了偏題結(jié)束。正式"Resualbe"部分铆惑。
基本數(shù)據(jù)類型擴展
1受裹、String 擴展
extension String {
///用于計算字符串在高度。
///例如晰韵,當需要動態(tài)計算TableVIewCell高度的時候滑蚯,需要根據(jù)某個Label的內(nèi)容String的長度來調(diào)整cell的高度隘膘,讓其能夠全部顯示內(nèi)容纵势。
func stringHeightWith(fontSize:CGFloat,width:CGFloat)->CGFloat
{
let font = UIFont.systemFontOfSize(fontSize)
let size = CGSizeMake(width,CGFloat.max)
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineBreakMode = .ByWordWrapping;
let attributes = [NSFontAttributeName:font,
NSParagraphStyleAttributeName:paragraphStyle.copy()]
let text = self as NSString
let rect = text.boundingRectWithSize(size, options:.UsesLineFragmentOrigin, attributes: attributes, context:nil)
return rect.size.height
}
///用于時間轉(zhuǎn)換
func dateStringFromTimestamp(timeStamp:NSString)->String
{
let ts = timeStamp.doubleValue
let formatter = NSDateFormatter ()
formatter.dateFormat = "yyyy年MM月dd日 HH:MM:ss"
let date = NSDate(timeIntervalSince1970 : ts)
return formatter.stringFromDate(date)
}
}
2、UIView 擴展
extension UIView {
///用于視圖的坐標
func x()->CGFloat
{
return self.frame.origin.x
}
func right()-> CGFloat
{
return self.frame.origin.x + self.frame.size.width
}
func y()->CGFloat
{
return self.frame.origin.y
}
func bottom()->CGFloat
{
return self.frame.origin.y + self.frame.size.height
}
func width()->CGFloat
{
return self.frame.size.width
}
func height()-> CGFloat
{
return self.frame.size.height
}
func setX(x: CGFloat)
{
var rect:CGRect = self.frame
rect.origin.x = x
self.frame = rect
}
func setRight(right: CGFloat)
{
var rect:CGRect = self.frame
rect.origin.x = right - rect.size.width
self.frame = rect
}
func setY(y: CGFloat)
{
var rect:CGRect = self.frame
rect.origin.y = y
self.frame = rect
}
func setBottom(bottom: CGFloat)
{
var rect:CGRect = self.frame
rect.origin.y = bottom - rect.size.height
self.frame = rect
}
func setWidth(width: CGFloat)
{
var rect:CGRect = self.frame
rect.size.width = width
self.frame = rect
}
func setHeight(height: CGFloat)
{
var rect:CGRect = self.frame
rect.size.height = height
self.frame = rect
}
/// 顯示一個Alert
class func showAlertView(title:String,message:String)
{
let alert = UIAlertView()
alert.title = title
alert.message = message
alert.addButtonWithTitle("好")
alert.show()
}
}
3、NSDate擴展
extension NSDate {
/**
將特定日期轉(zhuǎn)成系統(tǒng)日期 如:2015-05-24 04:12:00 +0000
- parameter string: 特定日期
- returns: 系統(tǒng)日期
*/
class func sinaDateToDate(string: String) -> NSDate? {
// 創(chuàng)建datefromatter
let df = NSDateFormatter()
// 設置地區(qū)
df.locale = NSLocale(localeIdentifier: "en")
// 設置日期格式
df.dateFormat = "EEE MMM dd HH:mm:ss zzz yyyy"
return df.dateFromString(string)
}
/// 返回日期描述字符串
///
/// 格式如下
/// - 剛剛(一分鐘內(nèi))
/// - X分鐘前(一小時內(nèi))
/// - X小時前(當天)
/// - 昨天 HH:mm(昨天)
/// - MM-dd HH:mm(一年內(nèi))
/// - yyyy-MM-dd HH:mm(更早期)
func dateDescription() -> String {
// 在ios中處理日期使用calendar
let calendar = NSCalendar.currentCalendar()
// 判斷是否是今天
if calendar.isDateInToday(self) {
// 獲取self和當前日期相差的秒數(shù)
let delta = Int(NSDate().timeIntervalSinceDate(self))
if delta < 60 {
return "剛剛"
}
if delta < 60 * 60 {
return "\(delta / 60) 分鐘前"
}
return "\(delta / 3600) 小時前"
}
var fmtString = "HH:mm"
// 判斷是否是昨天
if calendar.isDateInYesterday(self) {
fmtString = "昨天 \(fmtString)"
} else {
// 比較年份
let result = calendar.compareDate(self, toDate: NSDate(), toUnitGranularity: NSCalendarUnit.Year)
if result == NSComparisonResult.OrderedSame {
// 同一年
fmtString = "MM-dd \(fmtString)"
} else {
// 更早期
fmtString = "yyyy-MM-dd \(fmtString)"
}
}
// 創(chuàng)建NSDateFormatter
let fmt = NSDateFormatter()
fmt.locale = NSLocale(localeIdentifier: "en")
fmt.dateFormat = fmtString
return fmt.stringFromDate(self)
}
}
代碼片段
1箭昵、文件處理
class FileUtility: NSObject {
class func cachePath(fileName:String)->String
{
var arr = NSSearchPathForDirectoriesInDomains(.CachesDirectory, .UserDomainMask, true)
let path = arr[0]
return "\(path)/\(fileName)"
}
class func imageCacheToPath(path:String,image:NSData)->Bool
{
return image.writeToFile(path, atomically: true)
}
class func imageDataFromPath(path:String)->AnyObject
{
let exist = NSFileManager.defaultManager().fileExistsAtPath(path)
if exist
{
//var urlStr = NSURL.fileURLWithPath(path)
_ = NSData(contentsOfFile: path);
//var img:UIImage? = UIImage(data:data!)
//return img ?? NSNull()
let img = UIImage(contentsOfFile: path)
let url:NSURL? = NSURL.fileURLWithPath(path)
let dd = NSFileManager.defaultManager().contentsAtPath(url!.path!)
_ = UIImage(data:dd!)
if img != nil {
return img!
} else {
return NSNull()
}
}
return NSNull()
}
}
2税朴、支持縮放的Image
class YRImageZoomingView: UIScrollView,UIScrollViewDelegate {
var imageView:UIImageView?
var imageURL:String!
let placeHolder:UIImage = UIImage(named:"avatar.jpg")!
override init(frame: CGRect) {
super.init(frame: frame)
// Initialization code
self.delegate = self
self.imageView = UIImageView(frame:self.bounds)
self.imageView!.contentMode = .ScaleAspectFit
self.addSubview(self.imageView!)
self.showsHorizontalScrollIndicator = false
self.showsVerticalScrollIndicator = false
self.backgroundColor = UIColor.clearColor()
self.minimumZoomScale = 1;
self.maximumZoomScale = 3;
let doubleTap = UITapGestureRecognizer(target: self, action: "doubleTapped:")
doubleTap.numberOfTapsRequired = 2;
self.addGestureRecognizer(doubleTap);
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func doubleTapped(sender:UITapGestureRecognizer)
{
if self.zoomScale > 1.0
{
self.setZoomScale(1.0, animated:true);
}
else
{
let point = sender.locationInView(self);
self.zoomToRect(CGRectMake(point.x-50, point.y-50, 100, 100), animated:true)
}
}
func viewForZoomingInScrollView(scrollView: UIScrollView)->UIView?
{
return self.imageView
}
override func layoutSubviews()
{
super.layoutSubviews()
self.imageView!.setImage(self.imageURL,placeHolder:placeHolder)
}
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
override func drawRect(rect: CGRect)
{
// Drawing code
}
*/
}
3、圖片選擇器
import Foundation
import BSImagePicker
import Photos
/*
Copy the code snip below and paste in your UIViewController
---------------------
self!.TS_presentImagePickerController(
maxNumberOfSelections: 6,
select: { (asset: PHAsset) -> Void in
print("Selected: \(asset)")
}, deselect: { (asset: PHAsset) -> Void in
print("Deselected: \(asset)")
}, cancel: { (assets: [PHAsset]) -> Void in
print("Cancel: \(assets)")
}, finish: { (assets: [PHAsset]) -> Void in
print("Finish: \(assets)")
}, completion: { () -> Void in
print("completion")
})
------------------
*/
public extension UIViewController {
/**
封裝一下 BSImagePickerViewController 家制,改變 UINavigationBar 的顏色
- parameter maxNumberOfSelections: 最多選 多少個
- parameter select: 選中的圖片
- parameter deselect: 反選中的圖片
- parameter cancel: 取消按鈕
- parameter finish: 完成按鈕
- parameter completion: dimiss回掉完成
*/
func ts_presentImagePickerController(maxNumberOfSelections maxNumberOfSelections: Int, select: ((asset: PHAsset) -> Void)?, deselect: ((asset: PHAsset) -> Void)?, cancel: (([PHAsset]) -> Void)?, finish: (([PHAsset]) -> Void)?, completion: (() -> Void)?) {
let viewController = BSImagePickerViewController()
viewController.maxNumberOfSelections = maxNumberOfSelections
viewController.albumButton.tintColor = UIColor.whiteColor()
viewController.cancelButton.tintColor = UIColor.whiteColor()
viewController.doneButton.tintColor = UIColor.whiteColor()
UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.Default, animated: false)
self.bs_presentImagePickerController(viewController, animated: true,
select: select, deselect: deselect, cancel: cancel, finish: finish, completion: {_ in
TSApplicationManager.initNavigationBar()
if let newCompletion = completion {
newCompletion()
}
})
}
}
3正林、HTML 內(nèi)容的處理
說明:下面的使用場景:ios 9.1; xcode 7.1; swift 2.1
let html = <br>abac</br> //HTML內(nèi)容
// 下面這個方法很奇怪直接使用始終找不到
let data = html!.dataUsingEncoding(NSUTF32StringEncoding, allowLossyConversion: false)
do { //必須捕獲異常
let atext = try NSAttributedString(data: data!, options: [NSDocumentTypeDocumentAttribute : NSHTMLTextDocumentType], documentAttributes: nil)
article_content.attributedText = atext
} catch {
// 捕獲異常 }
to be continue ...