API CHANGE. See README
This commit is contained in:
parent
44de79d8c5
commit
170b1bc836
50
README.md
50
README.md
@ -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!)")
|
||||||
|
|||||||
@ -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
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -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]
|
||||||
|
|||||||
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user