swift扩展extension——swift学习(七)

首先看到swift扩展的时候,我就想起了OC的扩展和类别;于是我就在找swift的扩展和OC的扩展和类别是什么关系。经过几番查阅资料,发现swift的扩展和OC的类别是如出一辙。但是我又很一根筋地去查找swift类似OC扩展的东西是什么。但是我始终就是没找到,于是我就静下来想想,OC的扩展和分类的作用和区别是什么?使用场景是什么?所以,我们首先来看看OC的类别和扩展:
类别:可以动态的为现有类添加新的方法

//接口文件
@interface 已有类(类别名)
//方法定义
@end

//实现部分
@implementation 已有类(类别名)
//方法实现
@end
eg:
#import <UIKit/UIKit.h>
@interface UIColor (UIColorUInt32)
+(UIColor *)colorWithHexString:(NSString *)valueStr;
@end

#import "UIColor+UIColorUInt32.h"
@implementation UIColor (UIColorUInt32)
+(UIColor *)colorWithHexString:(NSString *)valueStr{
    NSScanner * scanner = [NSScanner scannerWithString:valueStr];
    UInt32 hexStr = 0;
    if (![scanner scanHexInt:&hexStr]) {
        return [UIColor clearColor];
    }else{
        return [UIColor colorWithRed:(CGFloat)((hexStr&0xFF0000)>>16)/255.0
                               green:(CGFloat)((hexStr&0x00FF00)>>8)/255.0
                                blue:(CGFloat)((hexStr&0x0000FF))/255.0
                               alpha:(CGFloat)(1.0)];
    }
}
@end

扩展:只是对某个类的接口进行扩展,这个是我们用的比较多的,一般我们习惯在.m文件中添加扩展。然后把一些私有的、不想让外部访问的接口和属性定义在这里。

@interface已有类 ()<代理>
//定义变量
//定义方法
@end

eg:
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property (nonatomic, copy)NSString * name;
- (NSString *)getString;
@end

#import "Person.h"
@interface Person()
@property (nonatomic, assign) NSInteger age;
- (void)walk;
@end

@implementation Person
- (void)walk{
    NSLog(@"walk...");
}
- (NSString *)getString{
    return _name;
}
@end

OK,到这里,相信也有点感觉了,swift根本不需要类似OC扩展的东西。因为swift只有一个文件呀。它的所有的东西都在class内。所以,解掉了这个梗之后,我们就来看看swift的扩展吧。
和OC一样,我们选择iOS——>Source——>Swift File创建一个swift文件就可以了。

import Foundation
import UIKit

extension UIColor{
    convenience init(valueStr:String) {
        let scanner:NSScanner = NSScanner(string:valueStr)
        var valueRGB:UInt32 = 0
        if scanner.scanHexInt(&valueRGB) == false {
            self.init(red: 0,green: 0,blue: 0,alpha: 0)
        }else{
            self.init(
                red:CGFloat((valueRGB & 0xFF0000)>>16)/255.0,
                green:CGFloat((valueRGB & 0x00FF00)>>8)/255.0,
                blue:CGFloat(valueRGB & 0x0000FF)/255.0,
                alpha:CGFloat(1.0)
            )
        }
    }
}
/*这里解释一下: NSScanner:这个类可以扫描字符串,从中挑选出我们需要的字符,方法scanHexInt(&valueRGB),可以扫描scanner的16进制的数据,并转换成10进制的数据复制给valueRGB。 convenience:便利初始化关键字。 */
//使用:
self.view.backgroundColor = UIColor(valueStr:"ffffff");

不另外生成一个swift文件:

/* 1、删除一个bridging-header和头文件之后,应该在Building Setting -> Swift Compilier-Code Generation中的Objective-C Bridging Header中删除里面的bridge 2、 extension: 扩展, 3、 subscript: 下标脚本:对一个东西通过索引、快速取值的一种语法,例如数组a[0]。swift中,我们可以对类、结构体、枚举定义下标脚本。下标语法使用set、get来定义读、写属性,不需要两个都有;定义set属性时,传入的参数默认名称为newValue, 4、 enumerate(): 字符自带函数,同时返回index以及数据 */

import UIKit

extension String{
    subscript(start:Int,length:Int)->String{
        get{
            return (self as NSString).substringWithRange(NSRange(location: start,length: length))
        }

        set{
            let tmp = self
            var s = ""
            var e = ""
            for(idx,item)in tmp.characters.enumerate(){
                if idx<start{
                    s += "\(item)"
                }
                if idx>=start+length{
                    e += "\(item)"
                }
            }
            self = s+newValue+e
        }
    }
    subscript(index:Int)->String{
        get{
            return String(self[self.startIndex.advancedBy(index)])
        }

        set{
            let tmp = self
            self = ""
            for(idx, item)in tmp.characters.enumerate(){
                if idx == index{
                    self += "\(newValue)"
                }else{
                    self += "\(item)"
                }
            }
        }
    }
}

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        var str = "fcf" // print("\(str[4,2])")//越界
        print("\(str[2,1])")
        str[3,3] = "eng"
        print("\(str)")
    }
}

ok,举的两个例子相信够去理解和使用了!

    原文作者:Shayne_win
    原文地址: https://blog.csdn.net/u012297622/article/details/51605253
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞