Swiftpack.co - ChanTsune/SwiftyPyString as Swift Package

Swiftpack.co is a collection of thousands of indexed Swift packages. Search packages.
See all packages published by ChanTsune.
ChanTsune/SwiftyPyString 2.2.0
Provide python like string operations library for swift
⭐️ 1
πŸ•“ 3 years ago
.package(url: "https://github.com/ChanTsune/SwiftyPyString.git", from: "2.2.0")

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
"οΌ‘οΌ’οΌ“οΌ”οΌ•".isdecimal() // true
"δΈ€".isdecimal() // false
"".isdecimal() // false

isdigit()

"123".isdigit() // true
"οΌ‘οΌ’οΌ“οΌ”οΌ•".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
"οΌ‘οΌ’οΌ“οΌ”οΌ•".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.

GitHub

link
Stars: 1
Last commit: 25 weeks ago
Advertisement: IndiePitcher.com - Cold Email Software for Startups

Release Notes

version 2.2.0
3 years ago
  • Add

    • StringProtocol multiplication
    • removeprefix, removesuffix method(#32)
    • join support Sequence protocol conformed value
  • Change

    • python3.9 replace(#33)
  • Fix

    • isTitlecase
    • capitalize
    • expandtabs
    • endswith, startswith
    • find, rfind
    • count
    • split, rsplit
    • istitle

Swiftpack is being maintained by Petr Pavlik | @ptrpavlik | @swiftpackco | API | Analytics