API CHANGE. See README

This commit is contained in:
Erik 2015-02-23 15:08:38 -05:00
parent 44de79d8c5
commit 170b1bc836
6 changed files with 110 additions and 116 deletions

View File

@ -1,7 +1,9 @@
Socket.IO-Client-Swift Socket.IO-Client-Swift
====================== ======================
Socket.IO-client for Swift. Supports ws/wss connections and binary. For socket.io 1.0+ and Swift 1.2 Socket.IO-client for Swift. Supports ws/wss connections and binary. For socket.io 1.0+ and Swift 1.2.
For Swift 1.1 use the master branch.
Installation Installation
============ ============
@ -13,11 +15,10 @@ API
=== ===
Constructor Constructor
----------- -----------
`init(socketURL: String, opts[String: AnyObject]? = nil)` - Constructs a new client for the given URL. opts can be omitted (will use default values.) `init(socketURL: String, opts:[String: AnyObject]? = nil)` - Constructs a new client for the given URL. opts can be omitted (will use default values.)
Methods Methods
------- -------
1. `socket.on(name:String, callback:((data:AnyObject?) -> Void)) -> SocketAckHandler` - Adds a handler for an event. Returns a SocketAckHandler which can be used to ack an event. See example. 1. `socket.on(name:String, callback:((data:NSArray?, ack:AckEmitter?) -> Void))` - Adds a handler for an event. Items are passed by an array. `ack` can be used to send an ack when one is requested. See example.
2. `socket.onMultipleItems(name:String, callback:((data:NSArray?) -> Void)) -> SocketAckHandler` - Adds a handler for an event that can have multiple items. Items are stored in an array. Returns a SocketAckHandler which can be used to ack an event. See example.
3. `socket.emit(event:String, args:AnyObject...)` - Sends a message. Can send multiple args. 3. `socket.emit(event:String, args:AnyObject...)` - Sends a message. Can send multiple args.
4. `socket.emitWithAck(event:String, args:AnyObject...) -> SocketAckHandler` - Sends a message that requests an acknoweldgement from the server. Returns a SocketAckHandler which you can use to add an onAck handler. See example. 4. `socket.emitWithAck(event:String, args:AnyObject...) -> SocketAckHandler` - Sends a message that requests an acknoweldgement from the server. Returns a SocketAckHandler which you can use to add an onAck handler. See example.
5. `socket.connect()` - Establishes a connection to the server. A "connect" event is fired upon successful connection. 5. `socket.connect()` - Establishes a connection to the server. A "connect" event is fired upon successful connection.
@ -43,9 +44,9 @@ let socket = SocketIOClient(socketURL: "https://localhost:8080", opts: [
]) ])
// Socket Events // Socket Events
socket.on("connect") {data in socket.on("connect") {data, ack in
println("socket connected") println("socket connected")
// Sending messages // Sending messages
socket.emit("testEcho") socket.emit("testEcho")
@ -58,9 +59,9 @@ socket.on("connect") {data in
true, ["test": "foo"], "bar") true, ["test": "foo"], "bar")
} }
// Requesting acks, and adding ack args // Requesting acks, and responding to acks
socket.on("ackEvent") {data in socket.on("ackEvent") {data, ack in
if let str = data as? String { if let str = data?[0] as? String {
println("Got ackEvent") println("Got ackEvent")
} }
@ -68,36 +69,37 @@ socket.on("ackEvent") {data in
println(data) println(data)
} }
}.ackWith("I got your event", "dude") ack?("Got your event", "dude")
}
socket.on("disconnect") {data in socket.on("disconnect") {data, ack in
if let reason = data as? String { if let reason = data?[0] as? String {
println("Socket disconnected: \(reason)") println("Socket disconnected: \(reason)")
} }
} }
socket.on("reconnect") {data in socket.on("reconnect") {data, ack in
if let reason = data as? String { if let reason = data?[0] as? String {
println("Socket reconnecting: \(reason)") println("Socket reconnecting: \(reason)")
} }
} }
socket.on("reconnectAttempt") {data in socket.on("reconnectAttempt") {data, ack in
if let triesLeft = data as? Int { if let triesLeft = data?[0] as? Int {
println(triesLeft) println(triesLeft)
} }
} }
// End Socket Events // End Socket Events
socket.on("jsonTest") {data in socket.on("jsonTest") {data, ack in
if let json = data as? NSDictionary { if let json = data?[0] as? NSDictionary {
println(json["test"]!) // foo bar println(json["test"]!) // foo bar
} }
} }
// Messages that have multiple items are passed // Messages that have multiple items are passed
// by an array // by an array
socket.onMultipleItems("multipleItems") {data in socket.on("multipleItems") {data, ack in
if data == nil { if data == nil {
return return
} }
@ -114,16 +116,16 @@ socket.onMultipleItems("multipleItems") {data in
println(obj["test"]) println(obj["test"])
} }
} }
// Recieving binary // Recieving binary
socket.on("dataTest") {data in socket.on("dataTest") {data, ack in
if let data = data as? NSData { if let data = data?[0] as? NSData {
println("data is binary") println("data is binary")
} }
} }
socket.on("objectDataTest") {data in socket.on("objectDataTest") {data, ack in
if let dict = data as? NSDictionary { if let dict = data?[0] as? NSDictionary {
if let data = dict["data"] as? NSData { if let data = dict["data"] as? NSData {
let string = NSString(data: data, encoding: NSUTF8StringEncoding) let string = NSString(data: data, encoding: NSUTF8StringEncoding)
println("Got data: \(string!)") println("Got data: \(string!)")

View File

@ -29,7 +29,6 @@ typealias AckCallback = (AnyObject?) -> Void
class SocketAckHandler { class SocketAckHandler {
let ackNum:Int! let ackNum:Int!
let event:String! let event:String!
var ackData:[AnyObject]?
var callback:AckCallback? var callback:AckCallback?
init(event:String, ackNum:Int = 0) { init(event:String, ackNum:Int = 0) {
@ -40,8 +39,4 @@ class SocketAckHandler {
func onAck(callback:AckCallback) { func onAck(callback:AckCallback) {
self.callback = callback self.callback = callback
} }
func ackWith(data:AnyObject...) {
self.ackData = data
}
} }

View File

@ -65,7 +65,7 @@ class SocketEvent {
} }
} }
static func createMessageForEvent(event:String, withArgs args:[AnyObject], class func createMessageForEvent(event:String, withArgs args:[AnyObject],
hasBinary:Bool, withDatas datas:Int = 0, toNamespace nsp:String?, wantsAck ack:Int? = nil) -> String { hasBinary:Bool, withDatas datas:Int = 0, toNamespace nsp:String?, wantsAck ack:Int? = nil) -> String {
var message:String var message:String
@ -104,36 +104,53 @@ class SocketEvent {
return self.completeMessage(message, args: args) return self.completeMessage(message, args: args)
} }
static func createAck(ack:Int, withEvent event:String, withArgs args:[AnyObject], class func createAck(ack:Int, withArgs args:[AnyObject], withAckType ackType:Int,
withAckType ackType:Int, withNsp nsp:String, withBinary binary:Int = 0) -> String { withNsp nsp:String, withBinary binary:Int = 0) -> String {
var msg:String var msg:String
if ackType == 3 { if ackType == 3 {
if nsp == "/" { if nsp == "/" {
msg = "43\(ack)[" msg = "43\(ack)["
if args.count == 0 {
println(msg + "]")
return msg + "]"
}
return self.completeMessage(msg, args: args) return self.completeMessage(msg, args: args)
} else { } else {
msg = "43/\(nsp),\(ack)[" msg = "43/\(nsp),\(ack)["
if args.count == 0 {
return msg + "]"
}
return self.completeMessage(msg, args: args) return self.completeMessage(msg, args: args)
} }
} else { } else {
if nsp == "/" { if nsp == "/" {
msg = "46\(binary)-\(ack)[" msg = "46\(binary)-\(ack)["
if args.count == 0 {
return msg + "]"
}
return self.completeMessage(msg, args: args) return self.completeMessage(msg, args: args)
} else { } else {
msg = "46\(binary)-/\(nsp),\(ack)[" msg = "46\(binary)-/\(nsp),\(ack)["
if args.count == 0 {
return msg + "]"
}
return self.completeMessage(msg, args: args) return self.completeMessage(msg, args: args)
} }
} }
} }
private static func completeMessage(var message:String, args:[AnyObject]) -> String { private class func completeMessage(var message:String, args:[AnyObject]) -> String {
var err:NSError? var err:NSError?
for arg in args { for arg in args {
@ -142,7 +159,7 @@ class SocketEvent {
options: NSJSONWritingOptions(0), error: &err) options: NSJSONWritingOptions(0), error: &err)
let jsonString = NSString(data: jsonSend!, encoding: NSUTF8StringEncoding) let jsonString = NSString(data: jsonSend!, encoding: NSUTF8StringEncoding)
message += jsonString! as! String message += jsonString! as String
message += "," message += ","
continue continue
} }

View File

@ -22,43 +22,28 @@
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE. // THE SOFTWARE.
typealias NormalCallback = (NSArray?, AckEmitter?) -> Void
typealias AckEmitter = (AnyObject...) -> Void
private func emitAckCallback(socket:SocketIOClient, num:Int, type:Int) -> AckEmitter {
func emitter(items:AnyObject...) {
socket.emitAck(num, withData: items, withAckType: type)
}
return emitter
}
class SocketEventHandler { class SocketEventHandler {
let ack:SocketAckHandler!
let event:String! let event:String!
let callback:NormalCallback? let callback:NormalCallback?
let callbackMult:MultipleCallback?
var multiEvent = false
init(event:String, callback:NormalCallback, ack:SocketAckHandler) { init(event:String, callback:NormalCallback) {
self.event = event self.event = event
self.callback = callback self.callback = callback
self.callbackMult = nil
self.ack = ack
} }
init(event:String, callback:MultipleCallback, ack:SocketAckHandler) { func executeCallback(_ items:NSArray? = nil, withAck ack:Int? = nil, withAckType type:Int? = nil,
self.event = event withSocket socket:SocketIOClient? = nil) {
self.callbackMult = callback callback?(items, ack != nil ? emitAckCallback(socket!, ack!, type!) : nil)
self.callback = nil
self.multiEvent = true
self.ack = ack
}
func executeCallback(item:AnyObject?, items:NSArray? = nil) {
if self.multiEvent {
if items != nil {
callbackMult?(items)
} else if item != nil {
callbackMult?([item!])
} else {
callbackMult?(nil)
}
} else {
if items != nil {
callback?(items)
} else {
callback?(item)
}
}
} }
} }

View File

@ -24,9 +24,6 @@
import Foundation import Foundation
typealias NormalCallback = (AnyObject?) -> Void
typealias MultipleCallback = (NSArray?) -> Void
class SocketIOClient: NSObject, SRWebSocketDelegate { class SocketIOClient: NSObject, SRWebSocketDelegate {
let socketURL:NSMutableString! let socketURL:NSMutableString!
let ackQueue = dispatch_queue_create("ackQueue".cStringUsingEncoding(NSUTF8StringEncoding), let ackQueue = dispatch_queue_create("ackQueue".cStringUsingEncoding(NSUTF8StringEncoding),
@ -57,9 +54,8 @@ class SocketIOClient: NSObject, SRWebSocketDelegate {
if mutURL["https://"].matches().count != 0 { if mutURL["https://"].matches().count != 0 {
self.secure = true self.secure = true
} else {
self.secure = false
} }
mutURL = mutURL["http://"] ~= "" mutURL = mutURL["http://"] ~= ""
mutURL = mutURL["https://"] ~= "" mutURL = mutURL["https://"] ~= ""
@ -198,7 +194,7 @@ class SocketIOClient: NSObject, SRWebSocketDelegate {
} }
// If the server wants to know that the client received data // If the server wants to know that the client received data
private func emitAck(ack:Int, withEvent event:String, withData data:[AnyObject]?, withAckType ackType:Int) { func emitAck(ack:Int, withData data:[AnyObject]?, withAckType ackType:Int) {
dispatch_async(self.ackQueue) {[weak self] in dispatch_async(self.ackQueue) {[weak self] in
if self == nil || !self!.connected || data == nil { if self == nil || !self!.connected || data == nil {
return return
@ -209,20 +205,20 @@ class SocketIOClient: NSObject, SRWebSocketDelegate {
if !hasBinary { if !hasBinary {
if self?.nsp == nil { if self?.nsp == nil {
str = SocketEvent.createAck(ack, withEvent: event, withArgs: items, str = SocketEvent.createAck(ack, withArgs: items,
withAckType: 3, withNsp: "/") withAckType: 3, withNsp: "/")
} else { } else {
str = SocketEvent.createAck(ack, withEvent: event, withArgs: items, str = SocketEvent.createAck(ack, withArgs: items,
withAckType: 3, withNsp: self!.nsp!) withAckType: 3, withNsp: self!.nsp!)
} }
self?.io?.send(str) self?.io?.send(str)
} else { } else {
if self?.nsp == nil { if self?.nsp == nil {
str = SocketEvent.createAck(ack, withEvent: event, withArgs: items, str = SocketEvent.createAck(ack, withArgs: items,
withAckType: 6, withNsp: "/", withBinary: emitDatas.count) withAckType: 6, withNsp: "/", withBinary: emitDatas.count)
} else { } else {
str = SocketEvent.createAck(ack, withEvent: event, withArgs: items, str = SocketEvent.createAck(ack, withArgs: items,
withAckType: 6, withNsp: self!.nsp!, withBinary: emitDatas.count) withAckType: 6, withNsp: self!.nsp!, withBinary: emitDatas.count)
} }
@ -256,16 +252,27 @@ class SocketIOClient: NSObject, SRWebSocketDelegate {
for handler in self.handlers { for handler in self.handlers {
if handler.event == event { if handler.event == event {
if data is NSArray { if data is NSArray {
handler.executeCallback(nil, items: (data as! NSArray))
if ack != nil { if ack != nil {
self.emitAck(ack!, withEvent: event, handler.executeCallback(data as? NSArray, withAck: ack!,
withData: handler.ack.ackData, withAckType: ackType) withAckType: ackType, withSocket: self)
} else {
handler.executeCallback(data as? NSArray)
} }
} else { } else {
handler.executeCallback(data)
// Trying to do a ternary expression in the executeCallback method
// seemed to crash Swift
var dataArr:NSArray? = nil
if let data:AnyObject = data {
dataArr = [data]
}
if ack != nil { if ack != nil {
self.emitAck(ack!, withEvent: event, handler.executeCallback(dataArr, withAck: ack!,
withData: handler.ack.ackData, withAckType: ackType) withAckType: ackType, withSocket: self)
} else {
handler.executeCallback(dataArr)
} }
} }
} }
@ -280,21 +287,9 @@ class SocketIOClient: NSObject, SRWebSocketDelegate {
} }
// Adds handler for single arg message // Adds handler for single arg message
func on(name:String, callback:NormalCallback) -> SocketAckHandler { func on(name:String, callback:NormalCallback) {
let ackHandler = SocketAckHandler(event: name) let handler = SocketEventHandler(event: name, callback: callback)
let handler = SocketEventHandler(event: name, callback: callback, ack: ackHandler)
self.handlers.append(handler) self.handlers.append(handler)
return ackHandler
}
// Adds handler for multiple arg message
func onMultipleItems(name:String, callback:MultipleCallback) -> SocketAckHandler {
let ackHandler = SocketAckHandler(event: name)
let handler = SocketEventHandler(event: name, callback: callback, ack: ackHandler)
self.handlers.append(handler)
return ackHandler
} }
// Opens the connection to the socket // Opens the connection to the socket
@ -303,7 +298,7 @@ class SocketIOClient: NSObject, SRWebSocketDelegate {
} }
// Parse an NSArray looking for binary data // Parse an NSArray looking for binary data
private static func parseArray(arr:NSArray, var placeholders:Int) -> (NSArray, Bool, [NSData]) { private class func parseArray(arr:NSArray, var placeholders:Int) -> (NSArray, Bool, [NSData]) {
var replacementArr = [AnyObject](count: arr.count, repeatedValue: 1) var replacementArr = [AnyObject](count: arr.count, repeatedValue: 1)
var hasBinary = false var hasBinary = false
var arrayDatas = [NSData]() var arrayDatas = [NSData]()
@ -352,7 +347,7 @@ class SocketIOClient: NSObject, SRWebSocketDelegate {
} }
// Parses data for events // Parses data for events
static func parseData(data:String?) -> AnyObject? { class func parseData(data:String?) -> AnyObject? {
if data == nil { if data == nil {
return nil return nil
} }
@ -370,7 +365,7 @@ class SocketIOClient: NSObject, SRWebSocketDelegate {
return parsed return parsed
} }
private static func parseEmitArgs(args:[AnyObject]) -> ([AnyObject], Bool, [NSData]) { private class func parseEmitArgs(args:[AnyObject]) -> ([AnyObject], Bool, [NSData]) {
var items = [AnyObject](count: args.count, repeatedValue: 1) var items = [AnyObject](count: args.count, repeatedValue: 1)
var numberOfPlaceholders = -1 var numberOfPlaceholders = -1
var hasBinary = false var hasBinary = false
@ -424,7 +419,7 @@ class SocketIOClient: NSObject, SRWebSocketDelegate {
} }
// Parses a NSDictionary, looking for NSData objects // Parses a NSDictionary, looking for NSData objects
private static func parseNSDictionary(dict:NSDictionary, var placeholders:Int) -> (NSDictionary, Bool, [NSData]) { private class func parseNSDictionary(dict:NSDictionary, var placeholders:Int) -> (NSDictionary, Bool, [NSData]) {
var returnDict = NSMutableDictionary() var returnDict = NSMutableDictionary()
var hasBinary = false var hasBinary = false
if placeholders == -1 { if placeholders == -1 {
@ -589,7 +584,7 @@ class SocketIOClient: NSObject, SRWebSocketDelegate {
} }
} else if messageGroups[1].hasPrefix("43") { } else if messageGroups[1].hasPrefix("43") {
let arr = Array(messageGroups[1]) let arr = Array(messageGroups[1])
let ackNum:String var ackNum:String
let nsp = messageGroups[2] let nsp = messageGroups[2]
if nsp == "" && self.nsp != nil { if nsp == "" && self.nsp != nil {
@ -671,7 +666,7 @@ class SocketIOClient: NSObject, SRWebSocketDelegate {
let placeholdersRemoved = mutMessageObject["(\\{\"_placeholder\":true,\"num\":(\\d*)\\})"] let placeholdersRemoved = mutMessageObject["(\\{\"_placeholder\":true,\"num\":(\\d*)\\})"]
~= "\"~~$2\"" ~= "\"~~$2\""
let mes:SocketEvent var mes:SocketEvent
if ackNum == "" { if ackNum == "" {
mes = SocketEvent(event: event, args: placeholdersRemoved, mes = SocketEvent(event: event, args: placeholdersRemoved,
placeholders: numberOfPlaceholders.toInt()!) placeholders: numberOfPlaceholders.toInt()!)
@ -685,8 +680,8 @@ class SocketIOClient: NSObject, SRWebSocketDelegate {
} else if binaryGroup[1].hasPrefix("46") { } else if binaryGroup[1].hasPrefix("46") {
let messageType = RegexMutable(binaryGroup[1]) let messageType = RegexMutable(binaryGroup[1])
let numberOfPlaceholders = (messageType["46"] ~= "") as String let numberOfPlaceholders = (messageType["46"] ~= "") as String
let ackNum:String var ackNum:String
let nsp:String var nsp:String
if binaryGroup[3] == "" { if binaryGroup[3] == "" {
ackNum = binaryGroup[2] ackNum = binaryGroup[2]

View File

@ -60,15 +60,15 @@ public class SwiftRegex: NSObject, BooleanType {
} }
public func range(options: NSMatchingOptions = nil) -> NSRange { public func range(options: NSMatchingOptions = nil) -> NSRange {
return regex.rangeOfFirstMatchInString(target as! String, options: nil, range: targetRange) return regex.rangeOfFirstMatchInString(target as String, options: nil, range: targetRange)
} }
public func match(options: NSMatchingOptions = nil) -> String! { public func match(options: NSMatchingOptions = nil) -> String! {
return substring(range(options: options)) as! String return substring(range(options: options)) as String
} }
public func groups(options: NSMatchingOptions = nil) -> [String]! { public func groups(options: NSMatchingOptions = nil) -> [String]! {
return groupsForMatch( regex.firstMatchInString(target as! String, options: options, range: targetRange) ) return groupsForMatch( regex.firstMatchInString(target as String, options: options, range: targetRange) )
} }
func groupsForMatch(match: NSTextCheckingResult!) -> [String]! { func groupsForMatch(match: NSTextCheckingResult!) -> [String]! {
@ -95,7 +95,7 @@ public class SwiftRegex: NSObject, BooleanType {
if let mutableTarget = target as? NSMutableString { if let mutableTarget = target as? NSMutableString {
for match in matchResults()!.reverse() { for match in matchResults()!.reverse() {
let replacement = regex.replacementStringForResult( match, let replacement = regex.replacementStringForResult( match,
inString: target as! String, offset: 0, template: newValue ) inString: target as String, offset: 0, template: newValue )
mutableTarget.replaceCharactersInRange(match.rangeAtIndex(groupno), withString: replacement) mutableTarget.replaceCharactersInRange(match.rangeAtIndex(groupno), withString: replacement)
} }
} else { } else {
@ -105,7 +105,7 @@ public class SwiftRegex: NSObject, BooleanType {
} }
func matchResults(options: NSMatchingOptions = nil) -> [NSTextCheckingResult]? { func matchResults(options: NSMatchingOptions = nil) -> [NSTextCheckingResult]? {
let matches = regex.matchesInString(target as! String, options: options, range: targetRange) let matches = regex.matchesInString(target as String, options: options, range: targetRange)
as? [NSTextCheckingResult] as? [NSTextCheckingResult]
if matches != nil { if matches != nil {
@ -130,8 +130,8 @@ public class SwiftRegex: NSObject, BooleanType {
public func dictionary(options: NSMatchingOptions = nil) -> Dictionary<String,String> { public func dictionary(options: NSMatchingOptions = nil) -> Dictionary<String,String> {
var out = Dictionary<String,String>() var out = Dictionary<String,String>()
for match in matchResults(options: options)! { for match in matchResults(options: options)! {
out[substring(match.rangeAtIndex(1)) as! String] = out[substring(match.rangeAtIndex(1)) as String] =
substring(match.rangeAtIndex(2)) as? String substring(match.rangeAtIndex(2)) as String
} }
return out return out
} }
@ -141,16 +141,16 @@ public class SwiftRegex: NSObject, BooleanType {
let out = NSMutableString() let out = NSMutableString()
var pos = 0 var pos = 0
regex.enumerateMatchesInString(target as! String, options: options, range: targetRange ) { regex.enumerateMatchesInString(target as String, options: options, range: targetRange ) {
(match: NSTextCheckingResult!, flags: NSMatchingFlags, stop: UnsafeMutablePointer<ObjCBool>) in (match: NSTextCheckingResult!, flags: NSMatchingFlags, stop: UnsafeMutablePointer<ObjCBool>) in
let matchRange = match.range let matchRange = match.range
out.appendString( self.substring( NSRange(location:pos, length:matchRange.location-pos) ) as! String ) out.appendString( self.substring( NSRange(location:pos, length:matchRange.location-pos) ) as String )
out.appendString( substitution(match, stop) ) out.appendString( substitution(match, stop) )
pos = matchRange.location + matchRange.length pos = matchRange.location + matchRange.length
} }
out.appendString( substring( NSRange(location:pos, length:targetRange.length-pos) ) as! String ) out.appendString( substring( NSRange(location:pos, length:targetRange.length-pos) ) as String )
if let mutableTarget = target as? NSMutableString { if let mutableTarget = target as? NSMutableString {
mutableTarget.setString(out as String) mutableTarget.setString(out as String)
@ -215,13 +215,13 @@ extension String {
} }
public func RegexMutable(string: NSString) -> NSMutableString { public func RegexMutable(string: NSString) -> NSMutableString {
return NSMutableString(string:string as! String) return NSMutableString(string:string as String)
} }
public func ~= (left: SwiftRegex, right: String) -> NSMutableString { public func ~= (left: SwiftRegex, right: String) -> NSMutableString {
return left.substituteMatches({match, stop in return left.substituteMatches({match, stop in
return left.regex.replacementStringForResult( match, return left.regex.replacementStringForResult( match,
inString: left.target as! String, offset: 0, template: right ) inString: left.target as String, offset: 0, template: right )
}, options: nil) }, options: nil)
} }
@ -234,7 +234,7 @@ public func ~= (left: SwiftRegex, right: [String]) -> NSMutableString {
} }
return left.regex.replacementStringForResult( match, return left.regex.replacementStringForResult( match,
inString: left.target as! String, offset: 0, template: right[matchNumber-1] ) inString: left.target as String, offset: 0, template: right[matchNumber-1] )
}, options: nil) }, options: nil)
} }
@ -242,7 +242,7 @@ public func ~= (left: SwiftRegex, right: (String) -> String) -> NSMutableString
// return right(left.substring(match.range)) // return right(left.substring(match.range))
return left.substituteMatches( return left.substituteMatches(
{match, stop -> String in {match, stop -> String in
right(left.substring(match.range) as! String) right(left.substring(match.range) as String)
}, options: nil) }, options: nil)
} }