美文网首页
Swift Reusable Code Segment

Swift Reusable Code Segment

作者: Robert_Zhang | 来源:发表于2015-12-08 16:18 被阅读147次

    可复用的swift代码段。为什么用英文做标题?为了突出“复用”

    文章的目的:记录经常使用的代码块方便复用
    更新次数:将会不定期持续更新
    内容来源:有些是从优秀开源代码中摘要的,有些是自己写的。在此不多做说明。
    文章权限:欢迎收藏转载,但请勿用于商业用途

    一定程度上说,编写代码是一件重复性很高的工作。当然我并不是说写出优质的代码是一件容易的事情,相反我想表达的是我们在大多数情况下会重复以前开发过的内容。所以代码的复用就显得尤为重要。说到这里我不得不分享一下,最近看到的一篇关于面向对象设计原则的文章。虽然是以Android为描述语言,但思路是相通的不耽误学习。

    面向对象的6个基本原则:

    • 1、单一职责原则:一个类中应该是一组相关性很高的函数、数据的封装。
    • 2、开闭原则:简单的说就是,一个类只对扩展开放,对修改关闭。
    • 3、里氏替换原则:所有引用基类的地方必须能透明地使用其子类的对象,简单的说就是父类能够使用的地方子类一定能够使用。
    • 4、接口隔离原则:客户端不应该依赖它不需要的接口。可以理解为一个方法中应该避免过多的接口依赖。
    • 5、依赖倒置原则:模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的。既面向接口编程,或者面向抽象类编程。
    • 6、迪米特原则:也叫最少知识原则。意思是,一个对象应该对其他对象有最少的了解。可以理解为,一连串的相关处理事件应该抽离封装出来。对于调用这个封装函数的调用者,封装代码内部逻辑是透明的。 以上六点是java面向对象的原则。其他语言应该也是适用的。
      如果感兴趣可以查看原文:面向对象的六个基本原则

    好了偏题结束。正式"Resualbe"部分。

    基本数据类型扩展

    1、String 扩展

    extension String {
    
        ///用于计算字符串在高度。
        ///例如,当需要动态计算TableVIewCell高度的时候,需要根据某个Label的内容String的长度来调整cell的高度,让其能够全部显示内容。
        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
        }
        
        ///用于时间转换
        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 {
        
        /**
         将特定日期转成系统日期 如:2015-05-24 04:12:00 +0000
         - parameter string: 特定日期
         - returns: 系统日期
         */
        class func sinaDateToDate(string: String) -> NSDate? {
            // 创建datefromatter
            let df = NSDateFormatter()
            
            // 设置地区
            df.locale = NSLocale(localeIdentifier: "en")
            
            // 设置日期格式
            df.dateFormat = "EEE MMM dd HH:mm:ss zzz yyyy"
            
            return df.dateFromString(string)
        }
        
        ///  返回日期描述字符串
        ///
        ///     格式如下
        ///     -   刚刚(一分钟内)
        ///     -   X分钟前(一小时内)
        ///     -   X小时前(当天)
        ///     -   昨天 HH:mm(昨天)
        ///     -   MM-dd HH:mm(一年内)
        ///     -   yyyy-MM-dd HH:mm(更早期)
        func dateDescription() -> String {
            
            // 在ios中处理日期使用calendar
            let calendar = NSCalendar.currentCalendar()
            
            // 判断是否是今天
            if calendar.isDateInToday(self) {
                
                // 获取self和当前日期相差的秒数
                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)"
                }
            }
            
            // 创建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 内容的处理

    说明:下面的使用场景:ios 9.1; xcode 7.1; swift 2.1

    let html = <br>abac</br> //HTML内容
    // 下面这个方法很奇怪直接使用始终找不到
    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 ...

    相关文章

      网友评论

          本文标题:Swift Reusable Code Segment

          本文链接:https://www.haomeiwen.com/subject/khpehttx.html