1. 程式人生 > >swift擴充套件extension——swift學習(七)

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,舉的兩個例子相信夠去理解和使用了!

相關推薦

swift擴充套件extension——swift學習()

首先看到swift擴充套件的時候,我就想起了OC的擴充套件和類別;於是我就在找swift的擴充套件和OC的擴充套件和類別是什麼關係。經過幾番查閱資料,發現swift的擴充套件和OC的類別是如出一轍。但是我又很一根筋地去查詢swift類似OC擴充套件的東西是什麼。

Swift 擴充套件(extension)

擴充套件就是向一個已有的類、結構體、列舉型別或者協議型別新增新功能(functionality)。Swift中的擴充套件就類似於ObjC中的分類(事實上在其他高階語言中更多的稱之為擴充套件而非分類),但是它要比分類強大的多.  Swift 中的擴充套件可以: 新增計算型屬

Swift 3.0 擴充套件(extension)的使用

請注意版本,Swift 3.0對應的是xcode 8,網上很多例子都是舊的,在xcode 8跑不起來。 擴充套件是向一個已有的類、結構體或列舉型別新增新的功能(在swift中擴充套件沒有名字)。 相當於Objective-C中Category(OC中可以有名字的,而且只能

【iOS】Swift擴充套件extension與協議protocol

一起連帶前面幾篇Playground小結程式碼都轉到github上了,註釋寫了很多,主要方便自己以後可以翻翻看。Swift語法主要部分差不多就這些了。當然還有泛型、運算子過載、ARC、閉包之類的補充。 一、擴充套件(extension) 擴充套件 extension (

Swift 擴充套件(十)

擴充套件 (Extensions) 向一個已有的類、結構體或列舉型別新增新功能,包括再沒有獲取原始碼的情況下擴充套件型別的能力(逆向建模) 1.語法 使用關鍵字 extensionextension SomeType { // new functionality t

Swift編程語言學習1.7——斷言

tro 然而 1.7 此外 構建 進行 情況 條件 可能 斷言 可選能夠讓你推斷值是否存在,你能夠在代碼中優雅地處理值缺失的情況。然而,在某些情況下,假設值缺失或者

Swift擴充套件UIView:增加width height屬性

import UIKit extension UIView { var x: CGFloat { get { return frame.origin.x } set(newValue) { var tempFra

Swift擴充套件UIColor

import Foundation import UIKit extension UIColor { convenience init(hex: String) { self.init(hex: hex, alpha: 1) }

Swift擴充套件Date

extension Date { static func getCurrentTime() -> Int64 { let now = Date() let timeInterval: TimeInterval = now.timeI

Swift 全面系統的學習(持續更新...)

最近專案不算緊,於是就學了學 Swift ,看了一大神寫的專案https://github.com/hrscy/DanTang,很受益,感謝開源!另外自己也寫了一些基礎程式碼,分享出來,第一是希望得到同行前輩的指導,第二是希望對需要的朋友有所幫助。

Swift-列舉的基本學習和高階使用

在 Swift 中,列舉型別是一等(first-class)型別 列舉是一種資料型別, 為一組相關的值定義了一個共同的型別 Swift 中的 enum 與 Objective-C 的 enum 不同, Swift 的列舉成員在被建立時不會被賦予一個預設的整型值

Swift基礎】Swift 4.0學習筆記

The Swift Programming Language 4.0 中文版學習筆記 1 1. 基礎部分 註釋 巢狀註釋: /* A /* B */ / 常量和變數 常量和變數名可以使用Unicode字元來命名,但不能包含數學符號,箭

Swift protocol extension method dispatch

Swift protocol extension method dispatchProtocol extension is one of the coolest features introduced in swift 2.0. They enable new ways to share implementa

swift Alamofire+ObjectMapper——swift(學習九)

Alamofire Alamofire是目前為止我接觸的swift最好的第三方下載庫,它根本就不需要另外封裝,所有的下載方法都是class func。同時呢,它提供了很多種回撥的方法: //最簡單下載 Alamofire.request(.GET, "h

swift文件筆記(十) -- 協議

協議就是協議裡的屬性方法,在遵循協議的類·結構體·列舉中,必須要有實現。 1.協議語法 protocol SomeProtocol {// 這裡是協議的定義部分  var mustBeSettable: Int { get set }//讀寫  

Swift 擴充套件 Storyboard 屬性

可以在 Storyboard 中直接設定 UI 控制元件的基本樣式。 import UIKit //@IBDesignable extension UIView { @IBInspectable var cornerRadius:CGFloat

Swiftextension的使用

swift中的extension(即為擴充套件):是向已有的一個類、結構體或者列舉新增新功能(例項方法或者型別方法),包括在沒有獲取原始碼的情況下擴充套件型別的能力。 對UIView擴充套件實現sw

swift--Swift 3.0實戰:實現Dispatch once擴充套件

在3中原有的Dispatch once已經被廢棄了。但是可以通過給DispatchQueue實現一個擴充套件方法來實現原有的功能。 程式碼如下: public extension DispatchQueue { private static var _onceTr

dubbo學習筆記 九 dubbo-common之動態擴充套件extension

extension 動態擴充套件包,dubbo裡面有很多 @SPI  @Activate @Adaptive 註解, 同時也有許多配置檔案。 如下面的路徑 private static final String SERVICES_DIRECTORY = "MET

Swift 基本知識之十 swift遍歷陣列的幾種方式

第一種 for 迴圈方式 第二種 for in方式 第三種 索引-值方式enumerate() 第一種 for迴圈方式 let arr:Array<Int> = [1,2,3