Gng Kit (iOS)
Installation
Swift Package
- URL:
https://git.gngs.co.jp/ios/gng-ios.git - Dependency Rule: Up to Next Major Version
import
import GngKit
UI
Alert / ActionSheet
AlertとActionSheetも、使い方は同じ。
// UIViewController内で
// Alert
Alert(title: "タイトル", message: "メッセージ", buttons: [
.default("OK") {
// ボタンをタップした時
self.dismiss(animated: true, completion: nil)
},
.destrucive("削除") { // 警告表示(赤色)
// ...
},
.cancel("キャンセル") // action処理を省略すると、何もしない(UIを閉じるだけ)
]).show(from: self) // 画面に表示
// ActionSheet
ActionSheet(title: "タイトル", message: "メッセージ", buttons: [
.default("OK") {
self.dismiss(animated: true, completion: nil)
},
.destrucive("削除") { // 警告表示(赤色)
// ...
},
.cancel("キャンセル")
]).show(from: self)
エラーポップアップ
// UIViewController内で
showError(
title: "タイトル",
message: ””メッセージ,
buttonTitle: "ボタンのテキスト(基本:OK)",
focusTo: nil // ボタンをタップした時、カーソルを移動させるView
) {
// ボタンをタップした時の処理。(focusTo処理の後)
}
- エラーメッセージ表示(UIAlert)
- エラーメッセージ確認後に、エラーになった入力Viewにカーソルを移動する
画面効果
Fade In/Out
画面全体、又は一部に対して、Fade In/Outアニメーションを行う。
// UIViewController内で
// 暗い → 明るい
fadeOut(
alpha: 0.3, // 初期の透明度
frame: nil // 対象の領域。nilの場合、画面全体
) { _ in
// アニメーションが完了した後の処理
}
// 画面全体に対しては、下記のように省略可能
fadeOut()
fadeOut()した、Viewをもとに戻す。
fadeIn { _ in
// アニメーションが完了した後の処理
}
Blur
Blur(
frame: CGRect, // 対象の領域
style: .regular // UIBlurEffect.Styleを参照
)
通知
App内で通知を表示
postLocalNotification(
title: "タイトル",
message: "メッセージ",
userInfo: [:] // 追加情報。UNMutableNotificationContent参照。
)
TableView
対象の行のdidSelectRowAtDelegateを実行する。
// UITableView内で
performDidSelect(rowAt: /*対象(IndexPath)*/)
IndexPath Extensions
// 次の行のIndexPath
let next: IndexPath = indexPath.nextRow
// 前の行のIndexPath。すでに一番前の場合はnilを返す。
let prev: IndexPath? = indexPath.prevRow
IO
HTTP通信
GET
let params: [String:String?] = [
"Key": "Value"
]
GngHttp.get(url: /*URL*/, params: params) { data: Data?, response: URLResponse?, error: Error? in
// 通信後の処理
}
POST
POSTもGETとほぼ同じ。
let params: [String:String?] = [
"Key": "Value"
]
GngHttp.post(url: /*URL*/, params: params) { data: Data?, response: URLResponse?, error: Error? in
// 通信後の処理
}
Muli-part
ファイルのアップロードなどはmulti-partデータでPOSTしなければならない。
let params: [String:Any] = [
"Key_str": "Value", // 文字列
"upload_img": image, // 画像(UIImage)
"key_data", data, // Data型
]
postMultipart(
url: /*URL*/,
params: params,
makeFileName: { key in
switch key {
case "upload_img": return "sample.jpg"
default: return nil
}
}
) { data: Data?, response: URLResponse?,
// 通信後の処理
}
データ処理
CSV
// CSVから読み込む
guard let csvUrl = Bundle.main.url(forResource: "sample", withExtension: "csv") else {
// sample.csvがない場合
return
}
Task {
var dataArr: [[String:Any]] = []
do {
// CSV内にHeaderテキストがアル場合、skipLines=1などを指定
try await parseCsvAsync(url: csvUrl, skipLines: 0) { row in
guard row.count >= 2 else { return }
var item: [String:Any] = [:]
for col in row {
switch col.colIndex {
case 0: // 1番目のカラム
item.0 = col.value
case 1: // 2番目のカラム
item.1 = col.asInt
default: continue
}
}
dataArr.append(item)
}
}
catch {
// エラー
}
didLoad(dataArr)
}
JSON
// パースするJSON文字列
// 文字列ではないのに、数値が文字列で入っている
let jsonString: String = """
{"id":"1", "name":"Suzuki", "point":"20.5"}
"""
// JSON文字列をData型に変換
let personalData: Data = jsonString.data(using: String.Encoding.utf8)!
do {
let items = try GngJson.convertToDictionary(json: personalData)
let id = GngJson.parseInt(from: items, key: "id") // Int型として解析
let name = items["name"] as! String
let point = GngJson.parseFloat(from: items, key: "point") // Float型として解析
} catch {
print(error)
}
文字列
文字列の一部を得る
"abcd1234".subStr(from: 4, length: 4) // -> "1234"
"abcd1234".subStr(from: 4) // -> "1234"
正規表現
if "asdf1234".isMatch(pattern: "^[0-9a-zA-Z]+$") {
print("ok")
}
Utils
Appバーっジョン
let shortVer = getAppShortVer() // アプリのバージョン
let buildVer = getAppBuildVer() // アプリのBuild番号
デバッグ関連
// XCodeからデバッグモードで実行されたか?
if IS_DEBUG_RUN {
// ...
}
他
スリープ抑止
setSleepDisable()
iCloudにバックアップ設定
// iOSは基本t的にアプリ内の「Document」以下のものをiCloudにバックアップする。
// しかし、容量が大きいファイル(又はDirectory)はバックアップの対象から外さなければならない。
let targetUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first
let targetPath = targetUrl!.absoluteString
setExcludedFromBackup(path: targetPath)
他のアプリを呼び出す(URL Schemeで他のアプリと連携する)
// 例)jp.co.gngs.api://text1/text2?text3=text4&text5=text6
let query = [
"text3": "text4",
"text5": "text6",
]
if openApplication(scheme: "jp.co.gngs.api", host: "text1", path: "text2", queryItems: query) {
// 成功
}