1

I have a question of splite the String.
And I try to write a function in playground and test it's runtime.
I don't know whether have another better function of splite string or not.
Have any idea to suggest me?
Thanks.

func spliteMessage() -> String {

let startTime = CACurrentMediaTime()
print("--> StartTime: \(startTime)")

let str:String = "<a href=\"url://app/user/5a4defba4d092f3f00e0fdb1\">@user1 </a><a href=\"url://app/user/5a4defba4d092f3f00e0fdb2\">@user2 </a><a href=\"url://app/user/5a4defba4d092f3f00e0fdb3\">@user3 </a><a href=\"url://app/user/5a4defba4d092f3f00e0fdb4\">@user4 </a><a href=\"url://app/user/5a4defba4d092f3f00e0fdb5\">@user5 </a><a href=\"url://app/user/5a4defba4d092f3f00e0fdb6\">@user6 </a><a href=\"url://app/user/5a4defba4d092f3f00e0fdb7\">@user7 </a><a href=\"url://app/user/5a4defba4d092f3f00e0fdb8\">@user8 </a><a href=\"url://app/user/5a4defba4d092f3f00e0fdb9\">@user9 </a><a href=\"url://app/user/5a4defba4d092f3f00e0fd10\">@user10 </a><a href=\"url://app/user/5a4defba4d092f3f00e0fd11\">@user11 </a><a href=\"url://app/user/5a4defba4d092f3f00e0fd12\">@user12 </a> Have a nice day!"

let fullArr = str.components(separatedBy: "</a>")
var finalArray = [[String:String]]()
var commonMessage:String = ""
var taggedMessage:String = ""

fullArr.forEach { (string) in

    if string.hasPrefix("<a href=\"url://app/user/") {

        var a = string.replacingOccurrences(of: "<a href=\"url://app/user/", with: "")
        var userId = (a as NSString).substring(to: 24)
        var name = (a as NSString).substring(from: 26)

        finalArray.append([userId:name])

    }else{

        commonMessage = string
    }
}

finalArray.forEach { (dic) in
    dic.forEach({ (id,name) in
        taggedMessage += name
    })
}

let finalmsg = taggedMessage + commonMessage

print("--> finalmsg: \(finalmsg)")

let endTime = CACurrentMediaTime()
print("--> EndTime: \(endTime)")

print("--> Time: \(endTime - startTime)")

return finalmsg
}

final print:

--> StartTime: 22153.978737749
--> finalmsg: @user1 @user2 @user3 @user4 @user5 @user6 @user7 @user8 @user9 @user10 @user11 @user12 Have a nice day!
--> EndTime: 22154.030463062
--> Time: 0.0517253129983146

Update:

//change finalArray type to dictionary.
finalArray = [String:String]()

finalArray.forEach({ (id,name) in
    taggedMessage += name
}
Beginnerrrrrr
  • 537
  • 1
  • 8
  • 27
  • 2
    It might be worth just enquiring as to your situation. Looks like you're making a screen scraper for some website; may be worth checking to see if they have an API? It would make your life much easier. – Jacob King Jan 16 '18 at 08:36
  • If I try @user1~@user100 it'll cause one second. So, I want to find another way to make it faster. – Beginnerrrrrr Jan 16 '18 at 09:18
  • Look at regular expressions (RegExp) : https://en.wikipedia.org/wiki/Regular_expression and their usage in iOS : https://developer.apple.com/documentation/foundation/nsregularexpression – Nicolas Buquet Jan 16 '18 at 09:25
  • @NicolasBuquet [No](https://stackoverflow.com/a/1732454/3418066) – Paulw11 Jan 16 '18 at 10:19
  • Does runtime be faster If I change the finalArray type to dictionary? Because it just have one time in forEach roop – Beginnerrrrrr Jan 17 '18 at 01:57

0 Answers0