swift擴充extension——swift學習(七)

來源:互聯網
上載者:User

首先看到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已有類 ()<代理>//定義變數//定義方法@endeg:#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 Foundationimport UIKitextension 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中刪除裡面的bridge2、 extension:    擴充,3、 subscript:    下標指令碼:對一個東西通過索引、快速取值的一種文法,例如數組a[0]。swift中,我們可以對類、結構體、枚舉定義下標指令碼。下標文法使用set、get來定義讀、寫屬性,不需要兩個都有;定義set屬性時,傳入的參數預設名稱為newValue,4、 enumerate():    字元內建函數,同時返回index以及資料 */import UIKitextension 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,舉的兩個例子相信夠去理解和使用了。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.