ChanTsune / SwiftyPyString

Provide python like string operations library for swift

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

SwiftyPyString

Build Status Cocoapods carthage GitHub release Cocoapods platforms Swift Version

SwiftyPyString is a string extension for Swift.
This library provide Python compliant String operation methods.

Installation

Cocoapods

pod 'SwiftyPyString'

Carthage

github 'ChanTsune/SwiftyPyString'

Swift Package Manager

import PackageDescription

let package = Package(
    name: "YourProject",
    dependencies: [
        .package(url: "https://github.com/ChanTsune/SwiftyPyString.git", from: "\(version)")
    ]
)

Usage

import SwiftyPyString

String extension

String sliceing subscript

let str = "0123456789"
str[0]
// 0
str[-1]
// 9

Slice String

let str = "0123456789"

str[0,5]
// 01234
str[0,8,2]
// 0246
str[nil,nil,-1]
// 9876543210

Use Slice object case

let str = "0123456789"
var slice = Slice(start:0, stop:5)
var sliceStep = Slice(start:0, stop:8, step:2)

str[slice]
// 01234
str[sliceStep]
// 0246

String Multiplication

var s = "Hello World! " * 2

// "Hello World! Hello World! "

Methods

capitalize()

"hello world!".capitalize() // "Hello world!"

casefold()

"ß".casefold() // "ss"

center(width [,fillchar])

"1234".center(10) // "   1234   "
"123"center(10) // "   123    "
"1234".center(10,fillchar:"0") // "0001234000"
"123"center(10,fillchar:"0") // "0001230000"

count(sub [,start [,end]])

"abc abc abc".count("abc") // 3
"aaaaaaaaaa".count("a", start:2) // 8
"bbbbbbbbbb".count("bb", end:8) // 4

endswith(suffix [,start [,end]])

"hello world!".endswith("!") // true
"hello world!".endswith("world!")  // true
"hello".endswith("world") // false
"hello".endswith(["hello","world","!"]) // true

expandtabs(tabsize=8)

"abc\tabc\t".expandtabs() // "abc        abc        "
"abc\tabc\t".expandtabs(4) // "abc    abc    "

find(sub [,start [,end]])

"123412312312345".find("123") // 0
"123412312312345".find("12345") // 10
"123412312312345".find("5") // 14
"123412312312345".find("31") // 6
"123412312312345".find("0") // -1

format(args...,kwargs)

Available after v2.0

"{}, {}, {}".format("a", "b", "c") // "a, b, c"
"{0}, {1}, {2}".format("a", "b", "c") // "a, b, c"
"{0}{1}{0}".format("abra", "cad") // "abracadabra"
"{:,}".format(1234567890) // "1,234,567,890"

Format specification

https://docs.python.org/3/library/string.html#format-specification-mini-language

format_map(kwargs)

Available after v2.0

"{A}, {B}, {C}".format(["A": "a", "B": "b", "C": "c"]) // "a, b, c"
"{number:,}".format(["number":1234567890]) // "1,234,567,890"

Format specification

https://docs.python.org/3/library/string.html#format-specification-mini-language

index(sub [,start [,end]]) throws

"123412312312345".index("123") // 0
"123412312312345".index("12345") // 10
"123412312312345".index("5") // 14
"123412312312345".index("31") // 6
"123412312312345".index("0") // throw PyException.ValueError

isalnum()

"123abc".isalnum() // true
"1000A".isalnum() // true
"日本語".isalnum() // true
"abc 123".isalnum() // false

isalpha()

"I have pen.".isalpha() // false
"qwerty".isalpha() // true
"日本語".isalpha() // true
"123".isalpha() // false
"".isalpha() // false

isascii()

"I have pen.".isascii() // trur
"qwerty".isascii() // true
"123".isascii() // true
"".isascii() // true
"非ASCII文字列".isascii() // false

isdecimal()

"123".isdecimal() // true
"12345".isdecimal() // true
"".isdecimal() // false
"".isdecimal() // false

isdigit()

"123".isdigit() // true
"12345".isdigit() // true
"".isdigit() // true
"".isdigit() // true

islower()

"lower case string".islower() // true
"Lower case string".islower() // false
"lower case String".islower() // false
"lower Case string".islower() // false
"小文字では無い".islower() // false

isnumeric()

"123".isnumeric() // true
"12345".isnumeric() // true
"".isnumeric() // true
"".isnumeric() // false

isprintable()

"".isprintable() // true
"abc".isprintable() // true
"\u{060D}".isprintable() // false

isspace()

" ".isspace() // true
"".isspace() // false
"Speace".isspace() // false

istitle()

"Title Case String".istitle() // true
"Title_Case_String".istitle() // true
"Title__Case  String".istitle() // true
"not Title Case String".istitle() // false
"NotTitleCaseString".istitle() // false
"Not Title case String".istitle() // false

isupper()

"UPPER CASE STRING".isupper() // true
"Upper Case String".isupper() // false
"大文字では無い".isupper() // false

join(iterable)

let array = ["abc","def","ghi"]
"".join(array) // "abcdefghi"
"-".join(array) // "abc-def-ghi"
"++".join(array) // "abc++def++ghi"

ljust(width [,fillchar])

"abc".ljust(1) // "abc"
"abc".ljust(5) // "  abc"
"abc".ljust(5, fillchar:"$") // "$$abc"

lower()

"ABCDE".lower() // "abcde"
"あいうえお".lower() // "あいうえお"

lstrip(chars=nil)

"  lstrip sample".lstrip() // "lstrip sample"
"  lstrip sample".lstrip(" ls") // "trip sample"
"lstrip sample".lstrip() // "lstrip sample"

maketrans(x [,y [,x]])

String.maketrans([97:"A",98:nil,99:"String"]) // ["a":"A","b":"","c":"String"]
String.maketrans(["a":"A","b":nil,"c":"String"]) // ["a":"A","b":"","c":"String"]
String.maketrans("abc",y: "ABC") // ["a":"A","b":"B","c":"C"]
String.maketrans("abc", y: "ABC", z: "xyz") // ["a":"A","b":"B","c":"C","x":"","y":"","z":""]

partition(sep)

"a,b,c".partition(",") // ("a",",","b,c")
"a,b,c".partition("x") // ("a,b,c","","")

replace(old, new [,count])

"abc".replace("bc", new: "bcd") // "abcd"
"Python python python python".replace("python", new: "Swift", count: 2) // "Python Swift Swift python"

rfind(sub [,start [,end]])

"0123456789".rfind("0") // 0
"0123456789".rfind("02") // -1
"0123454321".rfind("2") // 8
"0123454321".rfind("1", end: -1) // 1

rindex(sub [,start [,end]]) throws

"0123456789".rindex("0") // 0
"0123456789".rindex("02") // throw PyException.ValueError
"0123454321".rindex("2") // 8
"0123454321".rindex("1", end: -1) // 1

rjust(width [,fillchar])

"abc".rjust(1) // "abc"
"abc".rjust(5) // "abc  "
"abc"rjust(5,fillchar:"z") // "abczz"

rpartition(sep)

"a,b,c".rpartition(",") // ("a,b", ",", "c")
"a,b,c".rpartition("x") // ("", "", "a,b,c")

rsplit(sep=nil [,maxsplit])

"a,b,c,d,".rsplit(",") // ["a", "b", "c", "d", ""]
"a,b,c,d,".rsplit() // ["a,b,c,d,"]
"a,b,c,d,".rsplit(",", maxsplit: 2) // ["a,b,c","d", ""]
"a,b,c,d,".rsplit(",", maxsplit: 0) // ["a,b,c,d,"]
"aabbxxaabbaaddbb".rsplit("aa", maxsplit: 2) // ["aabbxx", "bb", "ddbb"]

rstrip(chars=nil)

"rstrip sample   ".rstrip() // "rstrip sample"
"rstrip sample   ".rstrip("sample ") // "rstri"
"  rstrip sample".rstrip() // "  rstrip sample"

split(sep=nil [,maxsplit])

"a,b,c,d,".split(",") // ["a", "b", "c", "d", ""]
"a,b,c,d,".split() // ["a,b,c,d,"]
"a,b,c,d,".split(",", maxsplit: 2) // ["a", "b", "c,d,"]
"a,b,c,d,".split(",", maxsplit: 0) // ["a,b,c,d,"]
"aabbxxaabbaaddbb".split("aa", maxsplit: 2) // ["", "bbxx", "bbaaddbb"]

splitlines([keepends])

"abc\nabc".splitlines() // ["abc", "abc"]
"abc\nabc\r".splitlines(true) // ["abc\n", "abc\r"]
"abc\r\nabc\n".splitlines() // ["abc", "abc"]
"abc\r\nabc\n".splitlines(true) // ["abc\r\n", "abc\n"]

startswith(prefix [,start [,end]])

"hello world!".startswith("hello") // true
"hello world!".startswith("h") // true
"hello".startswith("world") // flase
"hello".startswith(["hello", "world", "!"]) // true

strip(chars=nil)

"   spacious   ".strip() // "spacious"
"www.example.com".strip("cmowz.") // "example"

swapcase()

"aBcDe".swapcase() // "AbCdE"
"AbC dEf".swapcase() // "aBc DeF"
"あいうえお".swapcase() // "あいうえお"

title()

"Title letter".title() // "Title Letter"
"title Letter".title() // "Title Letter"
"abc  abC _ aBC".title() // "Abc  Abc _ Abc"

translate(transtable)

let table = String.maketrans("", y: "", z: "swift")

"I will make Python like string operation library".translate(table)
// "I ll make Pyhon lke rng operaon lbrary"

upper()

"abcde".upper() // "ABCDE"
"あいうえお".upper() // "あいうえお"

zfill()

"abc".zfill(1) // "abc"
"abc".zfill(5) // "00abc"
"+12".zfill(5) // "+0012"
"-3".zfill(5) // "-0003"
"+12".zfill(2) // "+12"

For more detail please refer below link
https://docs.python.org/3/library/stdtypes.html#string-methods

Sliceable protocol

protocol Sliceable : Collection {
    init() /* Required. */
    subscript (_ start: Int?, _ stop: Int?, _ step: Int?) -> Self { get }
    subscript (_ start: Int?, _ end: Int?) -> Self { get }
    subscript (_ i:Int) -> Self.Element { get } /* Required. */
    subscript (_ slice: Slice) -> Self { get }
    mutating func append(_ newElement: Self.Element) /* Required. */
}

With the introduction of SwiftyPyString, String conforms to the Sliceable protocol.

By conforming to Sliceable protocol, it can get partial sequences as introduced in Slice String.

If the type you want to conform to Sliceable is conforms to RangeReplaceableCollection, it can be used simply by defining subscript (_ i:Int) -> Self.Element { get }.

In addition, if associatedtype Index of Collection is Int, you can conform to Sliceable with a very short code as follows, like Array.

extension Array : Sliceable { }
let arr = [1, 2, 3, 4, 5]

arr[0, 3]
// [0, 1, 2]

let slice = Slice(step:2)

arr[slice]
// [1, 3, 5]

License

This project published under the MIT license. See the LICENSE file for more information.

About

Provide python like string operations library for swift

License:MIT License


Languages

Language:Swift 99.4%Language:Ruby 0.6%