Notice
Recent Posts
Recent Comments
Link
투케이2K
25. (TWOK/UTIL) [Ios/Swift] C_Util - string, 날짜, 빌드 정보, 모바일 제어, 형 변환 등 유틸 파일 클래스 본문
투케이2K 유틸파일
25. (TWOK/UTIL) [Ios/Swift] C_Util - string, 날짜, 빌드 정보, 모바일 제어, 형 변환 등 유틸 파일 클래스
투케이2K 2022. 3. 27. 13:10[설 명]
프로그램 : Ios / Swift
설 명 : string, 날짜, 빌드 정보, 모바일 제어, 형 변환 등 유틸 파일 클래스
[소스 코드]
import Foundation
import UIKit
class C_Util {
// MARK: - [클래스 설명]
/*
// -----------------------------------------
1. 프로그램 상 필요한 유틸 파일 모음 클래스
// -----------------------------------------
2. extension 관련 정의 클래스
// -----------------------------------------
3. getNowDateTime24 : 24 시간 형태 현재 날짜 확인
// -----------------------------------------
4. getNowDateTime24Number : 24 시간 형태 현재 날짜 확인 [숫자 형태]
// -----------------------------------------
5. showMobileBuildInfo : 모바일 빌드 정보 확인
// -----------------------------------------
6. getMobileCode : 모바일 버전 코드 확인 (ex : 1 : Build)
// -----------------------------------------
7. getMobileVersion : 모바일 버전 명 확인 (ex : 1.0.0 : Version)
// -----------------------------------------
8. getMobilePackageName : 모바일 번들 ID 패키지명 확인 (ex : com.test.app)
// -----------------------------------------
9. getMobileSize : 모바일 화면 디바이스 사이즈 구하기 (S / M / L)
// -----------------------------------------
10. matchString : 문자열 정규식 수행 메소드
// -----------------------------------------
11. hexStringToData : 헥사 문자열 데이터를 바이트 배열 값으로 반환 실시
// -----------------------------------------
12. dataToHexString : 바이트 배열 값을 헥사 문자열 데이터로 반환 실시
// -----------------------------------------
13. fixStringToDate : 고정 문자열 데이터를 Date 형식으로 반환 실시
// -----------------------------------------
14. dateToMilliseconds : 현재 날짜 및 시간을 타임 스탬프 형식 문자열로 반환 실시
// -----------------------------------------
15. millisecondsToDate : 타임 스탬프 형식 문자열 데이터를 24 시간 Date 날짜 형식으로 포맷 후 문자열 반환 실시
// -----------------------------------------
16. getDateMinus : 타임 스탬프 값 기준 두 날짜 차이 확인 (초, 분, 시간 반환)
// -----------------------------------------
17. stringNotNull : 문자열 데이터 null 체크 수행 실시 (널이 아닌 경우 true / 널인 경우 false)
// -----------------------------------------
18. stringMultiContains : 문자열 데이터에서 다중 contains 값 포함 확인 (다중 값 포함 시 true / 아닌 경우 false)
// -----------------------------------------
19. stringJsonObjectEnable : String 문자열 데이터를 Json Object 형식으로 변경 가능 한지 체크 (변경 가능 시 true / 아닌 경우 false)
// -----------------------------------------
20. dic_To_JsonObject_String : 딕셔너리 데이터를 Json Object 형식 문자열로 변환 실시
// -----------------------------------------
21. jsonObject_To_Dic : jsonObject 형식 문자열 데이터를 딕셔너리로 반환 실시
// -----------------------------------------
22. htmlTagRemoveString : html 태그 제거 및 문자열 데이터 반환 실시
// -----------------------------------------
23. stringToByte : string 문자열 데이터를 byte (data) 값으로 반환 실시
// -----------------------------------------
24. byteToString : byte (data) 데이터를 string 문자열 데이터로 반환 실시
// -----------------------------------------
25. charCount : 특정 문자 개수 카운트 반환 실시
// -----------------------------------------
26. removeArrayStringOverlap : array string 배열 중복 데이터 제거 실시
// -----------------------------------------
27. stringIsNumber : string 문자열 데이터 모두 정수 구성 여부 확인
// -----------------------------------------
28. dataToByteString : Data 를 Byte 바이트 값 문자열로 리턴 실시
// -----------------------------------------
29. doubleCutLength : Double 소수점 데이터를 특정 소수점 자릿수 기준으로 자르기 실시
// -----------------------------------------
30. arraySubList : subList 사용해 array list 가변 배열 데이터 부분 데이터 반환 실시
// -----------------------------------------
31. getNowKorDate24 : 한국 시간 대로 24 시간 설정을 맞춰서 날짜 및 시간 데이터 반환
// -----------------------------------------
32. arrayDic_To_jsonArrayInJsonObj_String : 배열 + 딕셔너리 데이터를 JsonArray + JsonObject 형태 String 문자열 데이터 반환
// -----------------------------------------
33. jsonArrayInJsonObj_To_arrayDic : JsonArray + JsonObject 형태 String 데이터를 배열 + 딕셔너리 데이터로 반환
// -----------------------------------------
34. arrayIntersect : Array 배열 데이터 교집합 수행 실시
// -----------------------------------------
35. stringIsUrlParsing : String 문자열 데이터가 URL 형식으로 파싱 가능 한지 체크 실시
// -----------------------------------------
36. urlFileExtensionName : URL 주소 파일 확장자 포함 확인 실시
// -----------------------------------------
37. appDownloadFile : 다운로드 매니저 사용해 파일 다운로드 수행
// -----------------------------------------
38. LPAD : 왼쪽 기준 부족한 데이터 채우기 수행
// -----------------------------------------
39. RPAD : 오른쪽 기준 부족한 데이터 채우기 수행
// -----------------------------------------
40. startRemoveChar : 시작 기준 특정 문자열 제거 실시
// -----------------------------------------
41. endRemoveChar : 종료 기준 특정 문자열 제거 실시
// -----------------------------------------
42. getDeviceOsVersion : 휴대폰 설정 디바이스 소프트웨어 OS 버전 리턴
// -----------------------------------------
43. getStringStartIndex : 문자열 데이터에서 특정 문자열 인덱스 시작 위치 확인
// -----------------------------------------
44. getDeviceModelName : 디바이스 기기 모델 이름 확인
// -----------------------------------------
45. readBundleTextFile : 프로젝트에 추가된 텍스트 파일 읽기 수행 : Bundle.main.path
// -----------------------------------------
*/
// MARK: - [24 시간 형태 현재 날짜 확인]
func getNowDateTime24() -> String {
/*
// -----------------------------------------
[getNowDateTime24 메소드 설명]
// -----------------------------------------
1. 24 시간 형태 현재 날짜 및 시간 출력 메소드
// -----------------------------------------
2. 호출 방법 : C_Util().getNowDateTime24()
// -----------------------------------------
*/
// [date 객체 설정 수행 실시]
let nowDate = Date() // 현재의 Date 날짜 및 시간
let dateFormatter = DateFormatter() // Date 포맷 객체 선언
dateFormatter.locale = Locale(identifier: "ko") // 한국 지정
// [date 포맷 타입 정의]
// dateFormatter.dateFormat = "yyyy.MM.dd kk:mm:ss E요일" // Date 포맷 타입 지정
dateFormatter.dateFormat = "yyyy-MM-dd kk:mm:ss" // Date 포맷 타입 지정
let date_string = dateFormatter.string(from: nowDate) // 포맷된 형식 문자열로 반환
// [로그 출력 실시]
print("")
print("====================================")
print("[C_Util >> getNowDateTime24() :: 24 시간 형태 현재 날짜 확인]")
print("-------------------------------")
print("date_string :: ", date_string)
print("====================================")
print("")
// [리턴 데이터 반환]
return date_string
}
// MARK: - [24 시간 형태 현재 날짜 확인 : 숫자 형태]
func getNowDateTime24Number() -> String {
/*
// -----------------------------------------
[getNowDateTime24Number 메소드 설명]
// -----------------------------------------
1. 24 시간 형태 현재 날짜 및 시간 출력 메소드
// -----------------------------------------
2. 호출 방법 : C_Util().getNowDateTime24Number()
// -----------------------------------------
*/
// [date 객체 설정 수행 실시]
let nowDate = Date() // 현재의 Date 날짜 및 시간
let dateFormatter = DateFormatter() // Date 포맷 객체 선언
dateFormatter.locale = Locale(identifier: "ko") // 한국 지정
// [date 포맷 타입 정의]
dateFormatter.dateFormat = "yyyyMMddkkmmss" // Date 포맷 타입 지정
//dateFormatter.dateFormat = "kkmmss" // Date 포맷 타입 지정
let date_string = dateFormatter.string(from: nowDate) // 포맷된 형식 문자열로 반환
// [로그 출력 실시]
print("")
print("====================================")
print("[C_Util >> getNowDateTime24Number() :: 24 시간 형태 현재 날짜 확인]")
print("-------------------------------")
print("date_string :: ", date_string)
print("====================================")
print("")
// [리턴 데이터 반환 실시]
return date_string
}
// MARK: - [모바일 빌드 정보 확인]
func showMobileBuildInfo(){
/*
// -----------------------------------------
[showMobileBuildInfo 메소드 설명]
// -----------------------------------------
1. 모바일 빌드 정보 확인 메소드
// -----------------------------------------
2. 호출 방법 : C_Util().showMobileBuildInfo()
// -----------------------------------------
*/
// [초기 변수 선언 실시]
var appName = ""
var appVersion = ""
var appBuildVersion = ""
var appBundleIdentifier = ""
if let infomation = Bundle.main.infoDictionary {
if let Name = infomation["CFBundleDisplayName"] as? String {
appName = Name
}
if let Version = infomation["CFBundleShortVersionString"] as? String {
appVersion = Version
}
if let BuildVersion = infomation["CFBundleVersion"] as? String {
appBuildVersion = BuildVersion
}
if let BundleIdentifier = infomation["CFBundleIdentifier"] as? String {
appBundleIdentifier = BundleIdentifier
}
}
// [로그 출력 실시]
print("")
print("====================================")
print("[C_Util >> showMobileBuildInfo() :: 모바일 빌드 정보 확인]")
print("-------------------------------")
print("appName :: ", appName)
print("-------------------------------")
print("appVersion :: ", appVersion)
print("-------------------------------")
print("appBuildVersion :: ", appBuildVersion)
print("-------------------------------")
print("appBundleIdentifier :: ", appBundleIdentifier)
print("====================================")
print("")
}
// MARK: - [모바일 버전 코드 확인]
func getMobileCode() -> String {
/*
// -----------------------------------------
[getMobileCode 메소드 설명]
// -----------------------------------------
1. 모바일 버전 코드 확인 메소드 (ex : 1 : Build)
// -----------------------------------------
2. 호출 방법 : C_Util().getMobileCode()
// -----------------------------------------
*/
// [초기 변수 선언 실시]
var appBuildVersion = ""
if let infomation = Bundle.main.infoDictionary {
if let BuildVersion = infomation["CFBundleVersion"] as? String {
appBuildVersion = BuildVersion
}
}
// [로그 출력 실시]
print("")
print("====================================")
print("[C_Util >> getMobileCode() :: 모바일 버전 코드 확인]")
print("-------------------------------")
print("code :: ", appBuildVersion)
print("====================================")
print("")
// [리턴 데이터 반환]
return appBuildVersion
}
// MARK: - [모바일 버전명 확인]
func getMobileVersion() -> String {
/*
// -----------------------------------------
[getMobileVersion 메소드 설명]
// -----------------------------------------
1. 모바일 버전 명 확인 메소드 (ex : 1.0.0 : Version)
// -----------------------------------------
2. 호출 방법 : C_Util().getMobileVersion()
// -----------------------------------------
*/
// [초기 변수 선언 실시]
var appVersion = ""
if let infomation = Bundle.main.infoDictionary {
if let Version = infomation["CFBundleShortVersionString"] as? String {
appVersion = Version
}
}
// [로그 출력 실시]
print("")
print("====================================")
print("[C_Util >> getMobileVersion() :: 모바일 버전 명 확인]")
print("-------------------------------")
print("version :: ", appVersion)
print("====================================")
print("")
// [리턴 데이터 반환]
return appVersion
}
// MARK: - [모바일 번들 ID 패키지명 확인]
func getMobilePackageName() -> String {
/*
// -----------------------------------------
[getMobilePackageName 메소드 설명]
// -----------------------------------------
1. 모바일 번들 ID 패키지명 확인 (ex : com.test.app)
// -----------------------------------------
2. 호출 방법 : C_Util().getMobilePackageName()
// -----------------------------------------
*/
// [초기 변수 선언 실시]
var appBundleIdentifier = ""
if let infomation = Bundle.main.infoDictionary {
if let BundleIdentifier = infomation["CFBundleIdentifier"] as? String {
appBundleIdentifier = BundleIdentifier
}
}
// [로그 출력 실시]
print("")
print("====================================")
print("[C_Util >> getMobilePackageName() :: 모바일 번들 ID 패키지명 확인]")
print("-------------------------------")
print("package :: ", appBundleIdentifier)
print("====================================")
print("")
// [리턴 데이터 반환]
return appBundleIdentifier
}
// MARK: - [모바일 화면 크기 구하기]
func getMobileSize() -> String {
/*
// -----------------------------------------
[getMobileSize 메소드 설명]
// -----------------------------------------
1. 모바일 화면 크기 구하기
// -----------------------------------------
2. 호출 방법 : C_Util().getMobileSize()
// -----------------------------------------
3. 리턴 반환 : S / M / L
// -----------------------------------------
*/
// [리턴 데이터 반환 변수 선언]
var returnData = ""
// [뷰 전체 논리적 폭 길이 : css 측정 값]
let _screenLogicalWidth = UIScreen.main.bounds.size.width
// [뷰 전체 논리적 높이 길이 : css 측정 값]
let _screenLogicalHeight = UIScreen.main.bounds.size.height
// [뷰 스케일 값]
let _screenScale = UIScreen.main.scale
// [뷰 전체 물리적 폭 길이 : 실제 디바이스 표현 화소]
let _screenPhysicalWidth = (_screenLogicalWidth * (_screenScale * _screenScale)) / 2
// [뷰 전체 물리적 높이 길이 : 실제 디바이스 표현 화소]
let _screenPhysicalHeight = (_screenLogicalHeight * (_screenScale * _screenScale)) / 2
// [디바이스 기기 모델 확인 실시]
let _deviceModel = UIDevice.current.model
// [디바이스 기기 버전 확인 실시]
let _deviceVersion = UIDevice.current.systemVersion
// [디바이스 기기 이름 확인 실시]
let _deviceName = UIDevice.current.name
// [디바이스 OS 확인 실시]
let _deviceOs = UIDevice.current.systemName
// [디바이스 화면 인치 사이즈 구하기]
let screenBounds = UIScreen.main.bounds
let screenScale = UIScreen.main.scale
let screenSize = CGSize(width: screenBounds.size.width * screenScale, height: screenBounds.size.height * screenScale)
let ppi = screenScale * (UIDevice.current.userInterfaceIdiom == .pad ? 132 : 163)
let horizontal = screenSize.width / ppi
let vertical = screenSize.height / ppi
let diagonal = sqrt(pow(horizontal, 2) + pow(vertical, 2))
// [로그 출력 실시]
print("")
print("====================================")
print("[C_Util >> getMobileSize() :: 모바일 화면 크기 확인]")
print("-------------------------------")
print("[_deviceModel :: \(_deviceModel)]")
print("-------------------------------")
print("[_deviceVersion :: \(_deviceVersion)]")
print("-------------------------------")
print("[_deviceName :: \(_deviceName)]")
print("-------------------------------")
print("[_deviceOs :: \(_deviceOs)]")
print("-------------------------------")
print("[_screenLogicalWidth :: \(_screenLogicalWidth)]")
print("-------------------------------")
print("[_screenLogicalHeight :: \(_screenLogicalHeight)]")
print("-------------------------------")
print("[_screenScale :: \(_screenScale)]")
print("-------------------------------")
print("[_screenPhysicalWidth :: \(_screenPhysicalWidth)]")
print("-------------------------------")
print("[_screenPhysicalHeight :: \(_screenPhysicalHeight)]")
print("-------------------------------")
print("[diagonal [인치] :: \(diagonal)]")
print("====================================")
print("")
// [화면 사이즈 확인 및 디바이스 기기 종류 확인]
if _screenLogicalWidth == 390 && _screenLogicalHeight == 844 {
print("")
print("====================================")
print("[C_Util >> getMobileSize() :: 디바이스 종류 확인]")
print("-------------------------------")
print("[Device :: iPhone 13 / iPhone 13 Pro / iPhone 12 / iPhone 12 Pro]")
print("====================================")
print("")
}
else if _screenLogicalWidth == 375 && _screenLogicalHeight == 812 {
print("")
print("====================================")
print("[C_Util >> getMobileSize() :: 디바이스 종류 확인]")
print("-------------------------------")
print("[Device :: iPhone 13 mini / iPhone 12 mini / iPhone 11 Pro / iPhone XS / iPhone X]")
print("====================================")
print("")
}
else if _screenLogicalWidth == 428 && _screenLogicalHeight == 926 {
print("")
print("====================================")
print("[C_Util >> getMobileSize() :: 디바이스 종류 확인]")
print("-------------------------------")
print("[Device :: iPhone 13 Pro Max / iPhone 12 Pro Max]")
print("====================================")
print("")
}
else if _screenLogicalWidth == 375 && _screenLogicalHeight == 667 {
print("")
print("====================================")
print("[C_Util >> getMobileSize() :: 디바이스 종류 확인]")
print("-------------------------------")
print("[Device :: iPhone SE 2nd gen / iPhone 8 / iPhone 7 / iPhone 6s / iPhone 6]")
print("====================================")
print("")
}
else if _screenLogicalWidth == 414 && _screenLogicalHeight == 896 {
print("")
print("====================================")
print("[C_Util >> getMobileSize() :: 디바이스 종류 확인]")
print("-------------------------------")
print("[Device :: iPhone 11 Pro Max / iPhone 11 / iPhone XR / iPhone XS Max]")
print("====================================")
print("")
}
else if _screenLogicalWidth == 414 && _screenLogicalHeight == 736 {
print("")
print("====================================")
print("[C_Util >> getMobileSize() :: 디바이스 종류 확인]")
print("-------------------------------")
print("[Device :: iPhone 8 Plus]")
print("====================================")
print("")
}
else if _screenLogicalWidth == 476 && _screenLogicalHeight == 847 {
print("")
print("====================================")
print("[C_Util >> getMobileSize() :: 디바이스 종류 확인]")
print("-------------------------------")
print("[Device :: iPhone 7 Plus / iPhone 6s Plus / iPhone 6 Plus]")
print("====================================")
print("")
}
else if _screenLogicalWidth == 320 && _screenLogicalHeight == 568 {
print("")
print("====================================")
print("[C_Util >> getMobileSize() :: 디바이스 종류 확인]")
print("-------------------------------")
print("[Device :: iPhone SE 1st gen / iPhone 5C / iPhone 5S / iPhone 5 / iPod touch 6th gen / iPod touch 5th gen]")
print("====================================")
print("")
}
else if _screenLogicalWidth == 320 && _screenLogicalHeight == 480 {
print("")
print("====================================")
print("[C_Util >> getMobileSize() :: 디바이스 종류 확인]")
print("-------------------------------")
print("[Device :: iPhone 4S / iPhone 4 / iPhone 3GS / iPhone 3G / iPhone 1st gen / iPod touch 4th gen]")
print("-------------------------------")
print("[Device :: iPod touch 3rd gen / iPod touch 2nd gen / iPod touch 1st gen]")
print("====================================")
print("")
}
else if _screenLogicalWidth == 744 && _screenLogicalHeight == 1133 {
print("")
print("====================================")
print("[C_Util >> getMobileSize() :: 디바이스 종류 확인]")
print("-------------------------------")
print("[Device :: iPad Mini (6th gen)]")
print("====================================")
print("")
}
else if _screenLogicalWidth == 810 && _screenLogicalHeight == 1080 {
print("")
print("====================================")
print("[C_Util >> getMobileSize() :: 디바이스 종류 확인]")
print("-------------------------------")
print("[Device :: iPad 9th gen / iPad 8th gen / iPad 7th gen]")
print("====================================")
print("")
}
else if _screenLogicalWidth == 1024 && _screenLogicalHeight == 1366 {
print("")
print("====================================")
print("[C_Util >> getMobileSize() :: 디바이스 종류 확인]")
print("-------------------------------")
print("[Device :: iPad Pro (5th gen 12.9) / iPad Pro (4th gen 12.9) / iPad Pro (3rd gen 12.9) / iPad Pro (2nd gen 12.9)]")
print("-------------------------------")
print("[Device :: iPad Pro (1st gen 12.9)]")
print("====================================")
print("")
}
else if _screenLogicalWidth == 834 && _screenLogicalHeight == 1194 {
print("")
print("====================================")
print("[C_Util >> getMobileSize() :: 디바이스 종류 확인]")
print("-------------------------------")
print("[Device :: iPad Pro (5th gen 11) / iPad Pro (4th gen 11) / iPad Pro (3rd gen 11)]")
print("====================================")
print("")
}
else if _screenLogicalWidth == 820 && _screenLogicalHeight == 1180 {
print("")
print("====================================")
print("[C_Util >> getMobileSize() :: 디바이스 종류 확인]")
print("-------------------------------")
print("[Device :: iPad Air (4th gen)]")
print("====================================")
print("")
}
else if _screenLogicalWidth == 768 && _screenLogicalHeight == 1024 {
print("")
print("====================================")
print("[C_Util >> getMobileSize() :: 디바이스 종류 확인]")
print("-------------------------------")
print("[Device :: iPad Mini (5th gen) / iPad 6th gen / iPad 5th gen / iPad Pro (1st gen 9.7)]")
print("-------------------------------")
print("[Device :: iPad mini 4 / iPad Air 2 / iPad mini 3 / iPad mini 2 / iPad Air]")
print("-------------------------------")
print("[Device :: iPad 4th gen / iPad mini / iPad 3rd gen / iPad 2 / iPad 1st gen]")
print("====================================")
print("")
}
else if _screenLogicalWidth == 834 && _screenLogicalHeight == 1112 {
print("")
print("====================================")
print("[C_Util >> getMobileSize() :: 디바이스 종류 확인]")
print("-------------------------------")
print("[Device :: iPad Air (3rd gen) / iPad Pro (2nd gen 10.5)]")
print("====================================")
print("")
}
else {
print("")
print("====================================")
print("[C_Util >> getMobileSize() :: 디바이스 종류 확인]")
print("-------------------------------")
print("[Device :: ELSE]")
print("====================================")
print("")
}
// [화면 인치 사이즈 기준으로 디바이스 크기 리턴 데이터 반환 실시]
if diagonal <= 3 {
/*
[디바이스 종류]
1. 시계
*/
returnData = "S"
}
else if diagonal <= 4 {
/*
[디바이스 종류]
1. 아이폰 3G , 아이폰 4 , 아이폰 4S
2. 아이폰 5 , 아이폰 5S , 아이폰 5c
3. 아이폰 SE (2016)
*/
returnData = "S"
}
else if diagonal <= 5 {
/*
[디바이스 종류]
1. 아이폰 6 , 아이폰 6s , 아이폰 7
2. 아이폰 8 , 아이폰 SE2 (2020)
*/
returnData = "M"
}
else if diagonal <= 6 {
/*
[디바이스 종류]
1. 아이폰 6 Plus , 아이폰 6s Plus , 아이폰 7 Plus
2. 아이폰 8 Plus , 아이폰 X , 아이폰 XS
3. 아이폰 11 Pro , 아이폰 12 mini , 아이폰 13 mini
*/
returnData = "M"
}
else if diagonal <= 7 {
/*
[디바이스 종류]
1. 아이폰 XS Max , 아이폰 XR , 아이폰 11
2. 아이폰 11 Pro Max , 아이폰 12 , 아이폰 12 Pro
3. 아이폰 12 Pro Max , 아이폰 13 , 아이폰 13 pro
4. 아이폰 13 Pro Max
*/
returnData = "L"
}
else {
returnData = "L"
}
// [로그 출력 실시]
print("")
print("====================================")
print("[C_Util >> getMobileSize() :: 디바이스 종류 확인]")
print("-------------------------------")
print("[디바이스 화면 사이즈 :: \(returnData)]")
print("====================================")
print("")
// [리턴 데이터 반환]
return returnData
}
// MARK: - [정규식 수행 메소드]
func matchString(string: String) -> String {
/*
// -----------------------------------------
[matchString 메소드 설명]
// -----------------------------------------
1. 정규식 수행 메소드
// -----------------------------------------
2. 호출 방법 : C_Util().matchString(string: "hello @@ TWOK !! 투케이 222")
// -----------------------------------------
3. 리턴 반환 : 정규식을 수행한 문자열 데이터 반환
// -----------------------------------------
*/
// [결과를 반환할 변수 선언 실시]
var returnData = ""
// [사전 인풋 데이터 널 체크 수행 실시]
if string != nil && string.count>0 && string != "" { // [인풋 값이 널이 아닌 경우]
let strArr = Array(string) // [문자열 한글자씩 확인을 위해 배열에 담는다]
let pattern = "^[ㄱ-ㅎㅏ-ㅣ가-힣a-zA-Z0-9]$" // [정규식 : 한글, 영어, 숫자만 허용 (공백, 특수문자 제거)]
//let pattern = "^[ㄱ-ㅎㅏ-ㅣ가-힣a-zA-Z0-9\\s]$" // [정규식 : 한글, 영어, 숫자, 공백만 허용 (특수문자 제거)]
// [문자열 길이가 한개 이상인 경우만 패턴 검사 수행]
var resultString = ""
if strArr.count > 0 {
if let regex = try? NSRegularExpression(pattern: pattern, options: .caseInsensitive) {
var index = 0
while index < strArr.count { // [string 문자 하나 마다 개별 정규식 체크]
let checkString = regex.matches(in: String(strArr[index]), options: [], range: NSRange(location: 0, length: 1))
if checkString.count == 0 {
index += 1 // [정규식 패턴 외의 문자가 포함된 경우]
}
else { // 정규식 포함 패턴의 문자
resultString += String(strArr[index]) // [리턴 문자열에 추가]
index += 1
}
}
}
// [리턴 변수에 삽입 실시]
returnData = resultString
}
}
// [로그 출력 실시]
print("")
print("====================================")
print("[C_Util >> matchString() :: 문자열 정규식 수행 실시]")
print("-------------------------------")
print("input :: \(string)")
print("-------------------------------")
print("return :: \(returnData)")
print("====================================")
print("")
// [리턴 데이터 반환]
return returnData
}
// MARK: - [hex string to byte array : 헥사 문자열을 바이트 배열로 반환]
func hexStringToData(string: String) -> Data {
/*
// -----------------------------------------
[hexStringToData 메소드 설명]
// -----------------------------------------
1. 헥사 문자열 데이터를 바이트 배열로 반환 수행
// -----------------------------------------
2. 호출 방법 : C_Util().hexStringToData(string: "01 23 45 67 89 ab cd ef")
// -----------------------------------------
3. 리턴 반환 : 헥사 문자열 데이터를 바이트 배열로 반환
// -----------------------------------------
*/
// [사전 인풋 데이터 널 체크 수행 실시]
var _string = ""
var data: Data = Data()
if (string != nil && string.count>0 && string != ""){
// [0x , 0X , 공백 데이터 제거 실시]
_string = string.replacingOccurrences(of: "0x", with: "")
_string = string.replacingOccurrences(of: "0X", with: "")
_string = string.replacingOccurrences(of: " ", with: "")
// [문자열 한글자씩 분리해서 배열에 담은 후 바이트 값으로 변환]
let stringArray = Array(_string)
for i in stride(from: 0, to: _string.count, by: 2) { // [문자열 2개씩 지정]
let pair: String = String(stringArray[i]) + String(stringArray[i+1])
if let byteNum = UInt8(pair, radix: 16) {
let byte = Data([byteNum])
data.append(byte)
}
else{
fatalError()
}
}
}
// [바이트 배열에 담긴 값 확인 실시]
var byteStr = ""
if data != nil && data.count > 0 {
byteStr = "["
for i in stride(from: 0, through: data.count-1, by: 1) {
byteStr += String(describing: data[i]) // [개별 바이트 값을 삽입]
if i != data.count-1 { // [배열 형태로 찍기 위함]
byteStr += ", "
}
}
byteStr += "]"
}
// [로그 출력 실시]
print("")
print("====================================")
print("[C_Util >> hexStringToData() :: 헥사 데이터를 바이트 배열 값으로 반환 실시]")
print("-------------------------------")
print("input :: \(string)")
print("-------------------------------")
print("format :: \(_string)")
print("-------------------------------")
print("return :: \(byteStr)")
print("====================================")
print("")
// [리턴 데이터 반환 실시]
return data
}
// MARK: - [byte array to hex string : 바이트 배열 값을 헥사 문자열 데이터로 반환]
func dataToHexString(data: Data) -> String {
/*
// -----------------------------------------
[dataToHexString 메소드 설명]
// -----------------------------------------
1. 바이트 배열을 헥사 문자열 데이터로 반환 실시
// -----------------------------------------
2. 호출 방법 :
var dataValue : Data = Data()
dataValue.append(1)
dataValue.append(35)
dataValue.append(69)
dataValue.append(103)
dataValue.append(137)
dataValue.append(171)
dataValue.append(205)
dataValue.append(239)
C_Util().dataToHexString(data: dataValue)
// -----------------------------------------
3. 리턴 반환 : 바이트 배열 데이터를 헥사 문자열 데이터로 반환
// -----------------------------------------
*/
// [리턴 데이터 변수 선언]
var returnData = ""
var byteStr = ""
// [사전 인풋 데이터 널 체크 수행 실시]
if data != nil && data.count>0 {
// [바이트 배열 값 확인 실시]
byteStr = "["
for i in stride(from: 0, through: data.count-1, by: 1) {
byteStr += String(describing: data[i]) // [개별 바이트 값을 삽입]
if i != data.count-1 { // [배열 형태로 찍기 위함]
byteStr += ", "
}
}
byteStr += "]"
// [헥사 문자열 데이터로 변환 실시]
returnData = data.map { String(format: "%02hhx ", $0) }.joined()
}
// [로그 출력 실시]
print("")
print("====================================")
print("[C_Util >> dataToHexString() :: 바이트 배열 값을 헥사 문자열 데이터로 반환 실시]")
print("-------------------------------")
print("input :: \(byteStr)")
print("-------------------------------")
print("return :: \(returnData)")
print("====================================")
print("")
// [리턴 데이터 반환 실시]
return returnData
}
// MARK: - [고정 날짜 DATE 날짜 반환 메소드 : 2000-01-01 00:00:00]
func fixStringToDate(_str : String) -> Date {
/*
// -----------------------------------------
[fixStringToDate 메소드 설명]
// -----------------------------------------
1. 특정 날짜 문자열 데이터를 Date 형식으로 반환 수행 실시
// -----------------------------------------
2. 호출 방법 : C_Util().fixStringToDate(_str: "2000-01-01 00:00:00")
// -----------------------------------------
3. 리턴 반환 : 고정 날짜 문자열 데이터를 Date 형식으로 반환 실시
// -----------------------------------------
*/
// -----------------------------------------
// MARK: [_str 인풋 데이터 형식]
// [24시간 형태] : yyyy-MM-dd kk:mm:ss
// [고정 시간 사용] : 2000-01-01 00:00:00
// -----------------------------------------
// [Date 포맷 객체]
let dateFormatter = DateFormatter()
// -----------------------------------------
// [Date 포맷 형식]
dateFormatter.dateFormat = "yyyy-MM-dd kk:mm:ss"
//dateFormatter.dateFormat = "yyyy-MM-dd" // 포맷 형식
// -----------------------------------------
// [인풋으로 들어온 날짜 형식 string 을 Date 값으로 변환 실시]
let convertDate:Date = dateFormatter.date(from: _str)!
// -----------------------------------------
// [로그 출력 실시]
print("")
print("====================================")
print("[C_Util >> fixStringToDate() :: 특정 날짜 및 시간 고정 Date 형식으로 반환 실시]")
print("-------------------------------")
print("input :: \(_str)")
print("-------------------------------")
print("return :: \(convertDate)")
print("====================================")
print("")
// -----------------------------------------
// [리턴 데이터 반환 실시]
return convertDate
}
// MARK: - [현재 날짜 및 시간을 타임 스탬프 형식 반환 : milliseconds]
func dateToMilliseconds() -> String {
/*
// -----------------------------------------
[dateToMilliseconds 메소드 설명]
// -----------------------------------------
1. 현재 날짜 및 시간을 타임 스탬프 형식 반환 : milliseconds
// -----------------------------------------
2. 호출 방법 : C_Util().dateToMilliseconds()
// -----------------------------------------
3. 리턴 반환 : 타임 스탬프 데이터를 String 형식으로 반환 실시 : [13자리] 1648349189806
// -----------------------------------------
*/
// [초기 리턴 데이터 변수 선언 실시]
var returnData = ""
// [리턴 데이터에 값 삽입 실시]
returnData = String(describing: Int64((Date().timeIntervalSince1970 * 1000.0).rounded()))
// [Date 포맷 객체]
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd kk:mm:ss"
// [타임 스탬프 값을 Date 로 변환]
let convertDate:Date = Date(timeIntervalSince1970: TimeInterval(Int64(returnData) ?? 0) / 1000)
// [리턴 결과에 삽입 실시]
let checkDate = String(describing: dateFormatter.string(from: convertDate))
// [로그 출력 실시]
print("")
print("====================================")
print("[C_Util >> dateToMilliseconds() :: 현재 날짜 및 시간을 타임 스탬프 형식 반환 실시]")
print("-------------------------------")
print("date :: \(checkDate)")
print("-------------------------------")
print("return [length] :: \(returnData.count)")
print("-------------------------------")
print("return [timeStamp] :: \(returnData)")
print("====================================")
print("")
// [리턴 데이터 반환 실시]
return returnData
}
// MARK: - [타임 스탬프 형식 문자열 데이터를 날짜로 포맷해서 반환 실시]
func millisecondsToDate(str: String) -> String {
/*
// -----------------------------------------
[millisecondsToDate 메소드 설명]
// -----------------------------------------
1. 타임 스탬프 형식 문자열 데이터를 24 시간 날짜로 포맷해서 반환 실시
// -----------------------------------------
2. 호출 방법 : C_Util().millisecondsToDate(str: "1648349189806")
// -----------------------------------------
3. 리턴 반환 : 24 시간 형태 Date 문자열 데이터
// -----------------------------------------
*/
// [초기 리턴 데이터 변수 선언 실시]
var returnData = ""
// [사전 인풋값 체크 수행 실시]
if str != nil && str.count>0 && str != "" {
// [Date 포맷 객체]
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd kk:mm:ss"
// [타임 스탬프 값을 Date 로 변환]
let convertDate:Date = Date(timeIntervalSince1970: TimeInterval(Int64(str) ?? 0) / 1000)
// [리턴 결과에 삽입 실시]
returnData = String(describing: dateFormatter.string(from: convertDate))
}
// [로그 출력 실시]
print("")
print("====================================")
print("[C_Util >> millisecondsToDate() :: 타임 스탬프 형식 문자열 데이터를 날짜 형식 문자열 데이터 반환]")
print("-------------------------------")
print("input :: \(str)")
print("-------------------------------")
print("return :: \(returnData)")
print("====================================")
print("")
// [리턴 데이터 반환 실시]
return returnData
}
// MARK: - [두 날짜 차이 계산 수행 실시 : 타임 스탬프 값 기준]
func getDateMinus(bigDate:String, smallDate:String) -> Int{
/*
// -----------------------------------------
[getDateMinus 메소드 설명]
// -----------------------------------------
1. 날짜 형식 : date 형식을 milli seconds 형식으로 받는다 (ex: 1644466392686)
// -----------------------------------------
2. bigDate (큰 날짜) - smallDate (작은 날짜) 연산 수행
// -----------------------------------------
3. 리턴 형식 : 초 , 분 , 시간 단위 선택
// -----------------------------------------
4. 호출 예시 :
- C_Util().getDateMinus(bigDate:"1644466392686", smallDate:"1644466392686") // [동일]
- C_Util().getDateMinus(bigDate:"1644466392686", smallDate:"1644466169826") // [다름]
// -----------------------------------------
*/
// [초기 리턴 데이터 선언]
var returnData = 0
// [인풋으로 들어온 값에 공백이 있는 경우 제거 실시]
var _bigDate = String(describing: bigDate ?? "")
var _smallDate = String(describing: smallDate ?? "")
_bigDate = _bigDate.replacingOccurrences(of: " ", with: "")
_smallDate = _smallDate.replacingOccurrences(of: " ", with: "")
// [인풋으로 들어온 값이 널이 아닌지 확인 실시]
if _bigDate != nil && _bigDate.count>0 && _bigDate != ""
&& _smallDate != nil && _smallDate.count>0 && _smallDate != "" {
// [인풋으로 들어온 값이 모두 숫자로 구성되어 있는지 확인 실시]
var _bigDate_NotNumber = false
var _smallDate_NotNumber = false
for _big_char in _bigDate {
if _big_char.isNumber == false { // 정수 값이 아닌 경우
_bigDate_NotNumber = true
}
}
for _small_char in _smallDate {
if _small_char.isNumber == false { // 정수 값이 아닌 경우
_smallDate_NotNumber = true
}
}
// [로직 처리 수행 실시]
if _bigDate_NotNumber == false && _smallDate_NotNumber == false { // 모두 정수로 구성된 경우
let _big_int64 = Int64(_bigDate) ?? 0 // 형변환
let _small_int64 = Int64(_smallDate) ?? 0 // 형변환
let b_date = Date(timeIntervalSince1970: TimeInterval(Int64(_big_int64) ?? 0) / 1000) // 정식 날짜로 출력
let s_date = Date(timeIntervalSince1970: TimeInterval(Int64(_small_int64) ?? 0) / 1000) // 정식 날짜로 출력
let minus = (_big_int64 - _small_int64) // 밀리세컨드 빼기 수행
let seconds = minus / 1000 // 초 단위 기준 차이
let minute = seconds / 60 // 분 단위 기준 차이
let hour = minute / 60 // 시간 단위 기준 차이
print("")
print("====================================")
print("[C_Util >> getDateMinus() :: 두 날짜 차이 계산 결과 확인]")
print("-------------------------------")
print("_bigDate [인풋 날짜_1] : ", _bigDate)
print("_smallDate [인풋 날짜_2] : ", _smallDate)
print("-------------------------------")
print("b_date [인풋 날짜_1] : ", b_date)
print("s_date [인풋 날짜_2] : ", s_date)
print("-------------------------------")
print("minus [빼기 수행] :: ", minus)
print("seconds (초) 차이 :: ", seconds)
print("minute (분) 차이 :: ", minute)
print("hour (시간) 차이 :: ", hour)
print("====================================")
print("")
// [원하는 타입 선택 후 리턴 결과 반환 실시]
returnData = Int(minute) // [분]
//returnData = Int(seconds) // [초]
return returnData
}
else { // 문자가 포함된 경우
print("")
print("====================================")
print("[C_Util >> getDateMinus() :: 두 날짜 차이 계산 에러]")
print("-------------------------------")
print("_bigDate [인풋 날짜_1] : ", _bigDate)
print("-------------------------------")
print("_smallDate [인풋 날짜_2] : ", _smallDate)
print("-------------------------------")
print("error [문자 에러] : ", "비정상 데이터")
print("====================================")
print("")
// [결과 리턴 수행 실시]
return returnData
}
}
else {
print("")
print("====================================")
print("[C_Util >> getDateMinus() :: 두 날짜 차이 계산 에러]")
print("-------------------------------")
print("_bigDate [인풋 날짜_1] : ", _bigDate)
print("-------------------------------")
print("_smallDate [인풋 날짜_2] : ", _smallDate)
print("-------------------------------")
print("error [널 에러] : ", "비정상 데이터")
print("====================================")
print("")
// [결과 리턴 수행 실시]
return returnData
}
}
// MARK: - [string 문자열 데이터 널 체크 수행 실시]
func stringNotNull(str: String) -> Bool {
/*
// -----------------------------------------
[stringNotNull 메소드 설명]
// -----------------------------------------
1. string 문자열 데이터 널 체크 수행 실시
// -----------------------------------------
2. 호출 방법 : C_Util().stringNotNull(str: "hello투케이")
// -----------------------------------------
3. 리턴 반환 : 널이 아닌 경우 true / 널인 경우 false
// -----------------------------------------
*/
// [초기 리턴 데이터 변수 선언 실시]
var returnData = false
// [인풋 데이터 널 체크 수행 실시]
if str != nil
&& str.count>0
&& str != ""
&& str.trimmingCharacters(in: .whitespacesAndNewlines) != ""
&& str.trimmingCharacters(in: .whitespacesAndNewlines) != "null"
&& str.isEmpty == false {
// [리턴 결과 데이터 삽입]
returnData = true
}
// [로그 출력 실시]
print("")
print("====================================")
print("[C_Util >> stringNotNull() :: string 문자열 데이터 널 체크 수행 실시]")
print("-------------------------------")
print("input :: \(str)")
print("-------------------------------")
print("return :: \(returnData)")
print("====================================")
print("")
// [리턴 데이터 반환 실시]
return returnData
}
// MARK: - [String 문자열 데이터 다중 contains 포함 여부 확인 실시]
func stringMultiContains(str: String, array:Array<String>) -> Bool {
/*
// -----------------------------------------
[stringMultiContains 메소드 설명]
// -----------------------------------------
1. String 문자열 데이터 다중 contains 포함 여부 확인 실시
// -----------------------------------------
2. 호출 방법 : C_Util().stringMultiContains(str: "hello투케이TWOK", array: ["투케이", "TWOK"])
// -----------------------------------------
3. 리턴 반환 : 다중 값을 포함하는 경우 true / 포함하지 않는 경우 false
// -----------------------------------------
*/
// [초기 리턴 데이터 변수 선언 실시]
var returnData = true
// [인풋 데이터 널 체크 수행 실시]
if str != nil
&& str.count>0
&& str != ""
&& str.trimmingCharacters(in: .whitespacesAndNewlines) != ""
&& str.trimmingCharacters(in: .whitespacesAndNewlines) != "null"
&& str.isEmpty == false
&& array != nil
&& array.count>0
&& array.isEmpty == false {
// [for 문을 돌면서 다중 값 포함 확인 실시]
for i in stride(from: 0, through: array.count-1, by: 1) {
if str.contains(array[i]) == true {
// [특정 값을 포함하는 경우]
}
else {
// [특정 값을 포함하지 않는 경우]
returnData = false
}
}
}
else {
// [리턴 데이터 값 삽입]
returnData = false
}
// [로그 출력 실시]
print("")
print("====================================")
print("[C_Util >> stringMultiContains() :: string 문자열 데이터 다중 contains 포함 여부 확인 실시]")
print("-------------------------------")
print("input [str] :: \(str)")
print("-------------------------------")
print("input [array] :: \(array)")
print("-------------------------------")
print("return :: \(returnData)")
print("====================================")
print("")
// [리턴 데이터 반환 실시]
return returnData
}
// MARK: - [String 문자열 데이터 Json Object 형식으로 변경 가능 한지 체크 실시]
func stringJsonObjectEnable(str: String) -> Bool {
/*
// -----------------------------------------
[stringJsonObjectEnable 메소드 설명]
// -----------------------------------------
1. String 문자열 데이터 Json Object 형식으로 변경 가능 한지 체크 실시
// -----------------------------------------
2. 호출 방법 :
let jsonData = "{\n" +
" \"name\" : \"투케이\",\n" +
" \"age\" : 29,\n" +
" \"color\" : [\"red\", \"yellow\"]\n" +
"}";
C_Util().stringJsonObjectEnable(str: jsonData)
// -----------------------------------------
3. 리턴 반환 : Json Object 형식으로 변경 가능한 경우 true / 아닌 경우 false
// -----------------------------------------
*/
// [초기 리턴 데이터 변수 선언 실시]
var returnData = false
// [인풋 데이터 널 체크 수행 실시]
if str != nil
&& str.count>0
&& str != ""
&& str.trimmingCharacters(in: .whitespacesAndNewlines) != ""
&& str.trimmingCharacters(in: .whitespacesAndNewlines) != "null"
&& str.isEmpty == false {
// [딕셔너리 객체 생성 실시 및 json 데이터 받음]
var jsonObj : Dictionary<String, Any> = [String : Any]()
do {
// [딕셔너리에 데이터 저장 실시]
jsonObj = try JSONSerialization.jsonObject(with: Data(str.utf8), options: []) as! [String:Any]
// [리턴 결과 삽입 실시]
returnData = true
} catch {
print("")
print("====================================")
print("[C_Util >> stringJsonObjectEnable() :: string 문자열 데이터 Json Object 형식으로 변경 가능 한지 체크 실시]")
print("-------------------------------")
print("catch :: ", error.localizedDescription)
print("====================================")
print("")
}
}
// [로그 출력 실시]
print("")
print("====================================")
print("[C_Util >> stringJsonObjectEnable() :: string 문자열 데이터 Json Object 형식으로 변경 가능 한지 체크 실시]")
print("-------------------------------")
print("input :: \(str)")
print("-------------------------------")
print("return :: \(returnData)")
print("====================================")
print("")
// [리턴 데이터 반환 실시]
return returnData
}
// MARK: - [딕셔너리 데이터를 Json Object 형식 문자열로 변환 수행 실시]
func dic_To_JsonObject_String(_dicData:Dictionary<String, Any>) -> String {
/*
// -----------------------------------------
[dic_To_JsonObject_String 메소드 설명]
// -----------------------------------------
1. 딕셔너리 데이터를 Json Object 형식 문자열로 변환 수행 실시
// -----------------------------------------
2. 호출 방법 :
let dic_1 : Dictionary<String, Any> = ["name":"투케이", "age":29] // [딕셔너리]
C_Util().dic_To_JsonObject_String(_dicData: dic_1)
// -----------------------------------------
3. 리턴 반환 : Json Object 형식 문자열
// -----------------------------------------
*/
// [초기 리턴 데이터 변수 선언 실시]
var returnData = ""
// [인풋 데이터 널 체크 수행 실시]
if _dicData != nil
&& _dicData.count>0
&& _dicData.isEmpty == false {
// [딕셔너리 데이터를 json 으로 변경 실시]
do {
let jsonCreate = try JSONSerialization.data(withJSONObject: _dicData, options: .prettyPrinted)
// [json 데이터를 리턴 변수에 삽입 실시]
returnData = String(data: jsonCreate, encoding: .utf8) ?? ""
} catch {
print("")
print("====================================")
print("[C_Util >> dic_To_JsonObject_String() :: 딕셔너리 데이터를 Json Object 형식 문자열로 변환 실시]")
print("-------------------------------")
print("catch :: ", error.localizedDescription)
print("====================================")
print("")
}
}
// [로그 출력 실시]
print("")
print("====================================")
print("[C_Util >> dic_To_JsonObject_String() :: 딕셔너리 데이터를 Json Object 형식 문자열로 변환 실시]")
print("-------------------------------")
print("input [_dicData] :: \(_dicData.description)")
print("-------------------------------")
print("return [Json String] :: \(returnData)")
print("====================================")
print("")
// [리턴 데이터 반환 실시]
return returnData
}
// MARK: - [Json Object 형식 문자열을 딕셔너리로 변환 수행 실시]
func jsonObject_To_Dic(jsonString: String) -> Dictionary<String, Any> {
/*
// -----------------------------------------
[jsonObject_To_Dic 메소드 설명]
// -----------------------------------------
1. Json Object 형식 문자열을 딕셔너리로 변환 수행 실시
// -----------------------------------------
2. 호출 방법 :
let jsonData = "{\n" +
" \"name\" : \"투케이\",\n" +
" \"age\" : 29,\n" +
" \"color\" : [\"red\", \"yellow\"]\n" +
"}";
let dicData : Dictionary<String, Any> = C_Util().jsonObject_To_Dic(jsonString: jsonData)
// -----------------------------------------
3. 리턴 반환 : 딕셔너리 데이터 반환
// -----------------------------------------
*/
// [초기 리턴 데이터 변수 선언 실시]
var returnData : Dictionary<String, Any> = [String : Any]()
// [인풋 데이터 널 체크 수행 실시]
if jsonString != nil
&& jsonString.count>0
&& jsonString != ""
&& jsonString.trimmingCharacters(in: .whitespacesAndNewlines) != ""
&& jsonString.trimmingCharacters(in: .whitespacesAndNewlines) != "null"
&& jsonString.isEmpty == false {
// [딕셔너리 데이터 변환 수행 실시]
do {
let dicCreate = try JSONSerialization.jsonObject(with: Data(jsonString.utf8), options: []) as! [String:Any]
// [리턴 변수에 삽입 실시]
returnData = dicCreate
} catch {
print("")
print("====================================")
print("[C_Util >> jsonObject_To_Dic() :: Json Object 형식 문자열을 딕셔너리로 변환 수행 실시]")
print("-------------------------------")
print("catch :: ", error.localizedDescription)
print("====================================")
print("")
}
}
// [로그 출력 실시]
print("")
print("====================================")
print("[C_Util >> jsonObject_To_Dic() :: Json Object 형식 문자열을 딕셔너리로 변환 수행 실시]")
print("-------------------------------")
print("input [jsonString] :: \(jsonString)")
print("-------------------------------")
print("return [Dictionary] :: \(returnData)")
print("====================================")
print("")
// [리턴 데이터 반환 실시]
return returnData
}
// MARK: - [html 태그 제거 및 리턴 문자열 반환 메소드]
func htmlTagRemoveString(_data:String) -> String {
/*
// -----------------------------------------
[htmlTagRemoveString 메소드 설명]
// -----------------------------------------
1. html 태그 제거 및 리턴 문자열 반환 메소드
// -----------------------------------------
2. 호출 방법 :
let data = "<p>test url</p><p><a href="https://www.naver.com">https://www.naver.com</a></p><p>&nbsp;</p><p>입니다</p><p>&nbsp;</p>";
C_Util().htmlTagRemoveString(_data: data)
// -----------------------------------------
3. 리턴 반환 : html 태그 제거 문자열 데이터
// -----------------------------------------
*/
// [초기 리턴 데이터 변수 선언 실시]
var returnData = ""
// [인풋 데이터 널 체크 수행 실시]
if _data != nil
&& _data.count>0
&& _data != ""
&& _data.trimmingCharacters(in: .whitespacesAndNewlines) != ""
&& _data.trimmingCharacters(in: .whitespacesAndNewlines) != "null"
&& _data.isEmpty == false {
guard let encodedData = _data.data(using: .utf8)
else {
print("")
print("====================================")
print("[C_Util >> htmlTagRemoveString() :: html 형식 태그 제거 문자열 데이터 반환 에러]")
print("-------------------------------")
print("error [1] :: data 변환 에러")
print("====================================")
print("")
return returnData
}
// [html 태그를 제거 하기 위해 옵션 설정 실시]
let options: [NSAttributedString.DocumentReadingOptionKey: Any] = [
.documentType: NSAttributedString.DocumentType.html,
.characterEncoding: String.Encoding.utf8.rawValue
]
do {
// [html 태그 1차 제거 실시]
let attributed = try NSAttributedString(data: encodedData,
options: options,
documentAttributes: nil)
returnData = attributed.string
// [html 태그 2차 제거 실시]
var checkCount = 0;
for i in stride(from: 0, through: returnData.count-1, by: 1) {
let charIndex = returnData.index(returnData.startIndex, offsetBy: i)
if returnData[charIndex] == "&" {
checkCount = checkCount + 1 // [카운트 증가 실시]
}
}
if checkCount > 0 {
for k in stride(from: 0, through: checkCount-1, by: 1) {
guard let encodedData = returnData.data(using: .utf8)
else {
print("")
print("====================================")
print("[C_Util >> htmlTagRemoveString() :: html 형식 태그 제거 문자열 데이터 반환 에러]")
print("-------------------------------")
print("error [2] :: data 변환 에러")
print("====================================")
print("")
return returnData
}
do {
let attributed = try NSAttributedString(data: encodedData,
options: options,
documentAttributes: nil)
returnData = attributed.string
}
catch {
print("")
print("====================================")
print("[C_Util >> htmlTagRemoveString() :: html 형식 태그 제거 문자열 데이터 반환 에러]")
print("-------------------------------")
print("catch [2] :: \(error.localizedDescription)")
print("====================================")
print("")
}
}
}
// [문자열 연속 공백 제거 실시]
var str_array = Array(returnData)
var remove_array : Array<Int> = []
var nullCheck = 0
for j in stride(from: 0, through: str_array.count-1, by: 1) {
if j != str_array.count-1 {
var first = str_array[j].description.replacingOccurrences(of: " ", with: "")
first = first.trimmingCharacters(in: .whitespacesAndNewlines)
var second = str_array[j+1].description.replacingOccurrences(of: " ", with: "")
second = second.trimmingCharacters(in: .whitespacesAndNewlines)
if first.count == 0 && second.count == 0 {
remove_array.append(j)
}
}
}
if remove_array != nil && remove_array.count>0 && remove_array.isEmpty == false {
for k in stride(from: 0, through: remove_array.count-1, by: 1){
str_array.remove(at: remove_array[k]-k) // [한개씩 배열데이터를 삭제할 때 마다 인덱스 값을 맞추기 위함]
}
}
returnData = ""
for v in stride(from: 0, through: str_array.count-1, by: 1){
returnData = returnData + String(describing: str_array[v])
}
// [문자열 양쪽 끝 공백 제거 실시]
returnData = returnData.trimmingCharacters(in: .whitespacesAndNewlines)
}
catch {
print("")
print("====================================")
print("[C_Util >> htmlTagRemoveString() :: html 형식 태그 제거 문자열 데이터 반환 에러]")
print("-------------------------------")
print("catch [1] :: \(error.localizedDescription)")
print("====================================")
print("")
}
}
// [로그 출력 실시]
print("")
print("====================================")
print("[C_Util >> htmlTagRemoveString() :: html 형식 태그 제거 문자열 데이터 반환 실시]")
print("-------------------------------")
print("input :: \(_data)")
print("-------------------------------")
print("return :: \(returnData)")
print("====================================")
print("")
// [리턴 데이터 반환 실시]
return returnData
}
// MARK: - [String to Byte (Data) 변환 수행 메소드]
func stringToByte(string: String) -> Data {
/*
// -----------------------------------------
[stringToByte 메소드 설명]
// -----------------------------------------
1. string 문자열 데이터를 byte (data) 값으로 반환
// -----------------------------------------
2. 호출 방법 : C_Util().stringToByte(string: "hello")
// -----------------------------------------
3. 리턴 반환 : Data 값 반환 실시
// -----------------------------------------
*/
// [초기 리턴 데이터 변수 선언 실시]
var returnData : Data = Data()
var byteStr = ""
// [인풋 데이터 널 체크 수행 실시]
if string != nil
&& string.count>0
&& string != ""
&& string.trimmingCharacters(in: .whitespacesAndNewlines) != ""
&& string.trimmingCharacters(in: .whitespacesAndNewlines) != "null"
&& string.isEmpty == false {
// [리턴 변수에 삽입 실시]
returnData = string.data(using: .utf8)!
// [바이트 배열 값 확인 실시]
byteStr = "["
for i in stride(from: 0, through: returnData.count-1, by: 1) {
byteStr += String(describing: returnData[i]) // [개별 바이트 값을 삽입]
if i != returnData.count-1 { // [배열 형태로 찍기 위함]
byteStr += ", "
}
}
byteStr += "]"
}
// [로그 출력 실시]
print("")
print("====================================")
print("[C_Util >> stringToByte() :: string 문자열 데이터를 byte (data) 값으로 반환 실시]")
print("-------------------------------")
print("input :: \(string)")
print("-------------------------------")
print("return [length] :: \(returnData)")
print("-------------------------------")
print("return [data] :: \(byteStr)")
print("====================================")
print("")
// [리턴 데이터 반환 실시]
return returnData
}
// MARK: - [Byte (Data) To String 변환 수행 메소드]
func byteToString(data: Data) -> String {
/*
// -----------------------------------------
[byteToString 메소드 설명]
// -----------------------------------------
1. Byte (Data) 데이터를 String 값으로 반환
// -----------------------------------------
2. 호출 방법 :
var dataValue : Data = Data()
dataValue.append(104)
dataValue.append(101)
dataValue.append(108)
dataValue.append(108)
dataValue.append(111)
C_Util().byteToString(data: dataValue)
// -----------------------------------------
3. 리턴 반환 : String 값 반환 실시
// -----------------------------------------
*/
// [초기 리턴 데이터 변수 선언 실시]
var returnData = ""
var byteStr = ""
// [인풋 데이터 널 체크 수행 실시]
if data != nil
&& data.count>0
&& data.isEmpty == false {
// [리턴 변수에 삽입 실시]
returnData = String(decoding: data, as: UTF8.self)
// [바이트 배열 값 확인 실시]
byteStr = "["
for i in stride(from: 0, through: data.count-1, by: 1) {
byteStr += String(describing: data[i]) // [개별 바이트 값을 삽입]
if i != returnData.count-1 { // [배열 형태로 찍기 위함]
byteStr += ", "
}
}
byteStr += "]"
}
// [로그 출력 실시]
print("")
print("====================================")
print("[C_Util >> byteToString() :: Byte (Data) 데이터를 String 값으로 반환 실시]")
print("-------------------------------")
print("input [length] :: \(data)")
print("-------------------------------")
print("input [byte] :: \(byteStr)")
print("-------------------------------")
print("return [string] :: \(returnData)")
print("====================================")
print("")
// [리턴 데이터 반환 실시]
return returnData
}
// MARK: - [특정 문자 개수 값 반환 메소드]
func charCount(string: String, char: String) -> Int {
/*
// -----------------------------------------
[charCount 메소드 설명]
// -----------------------------------------
1. 특정 문자 개수 값 반환
// -----------------------------------------
2. 호출 방법 : C_Util().charCount(string: "hello,Twok,투케이", char: ",")
// -----------------------------------------
3. 리턴 반환 : 특정 문자 개수 int 값 반환
// -----------------------------------------
*/
// [초기 리턴 데이터 변수 선언 실시]
var returnData = 0
// [인풋 데이터 널 체크 수행 실시]
if string != nil
&& string.count>0
&& string != ""
&& string.trimmingCharacters(in: .whitespacesAndNewlines) != ""
&& string.trimmingCharacters(in: .whitespacesAndNewlines) != "null"
&& string.isEmpty == false
&& char != nil
&& char.count == 1
&& char != ""
&& char.trimmingCharacters(in: .whitespacesAndNewlines) != ""
&& char.trimmingCharacters(in: .whitespacesAndNewlines) != "null"
&& char.isEmpty == false {
let array = Array(string)
// [for 문을 돌면서 특정 문자 포함 확인]
for i in stride(from: 0, through: array.count-1, by: 1) {
if String(describing: array[i]) == String(describing: char) {
// [리턴 변수에 삽입 실시]
returnData = returnData + 1
}
}
}
// [로그 출력 실시]
print("")
print("====================================")
print("[C_Util >> charCount() :: 특정 문자 개수 값 반환 실시]")
print("-------------------------------")
print("input [string] :: \(string)")
print("-------------------------------")
print("input [char] :: \(char)")
print("-------------------------------")
print("return [count] :: \(returnData)")
print("====================================")
print("")
// [리턴 데이터 반환 실시]
return returnData
}
// MARK: - [배열 중복 데이터 제거 메소드]
func removeArrayStringOverlap(array: Array<String>) -> Array<String> {
/*
// -----------------------------------------
[removeArrayStringOverlap 메소드 설명]
// -----------------------------------------
1. 배열 중복 데이터 제거 메소드
// -----------------------------------------
2. 호출 방법 :
var strArray : Array<String> = []
strArray.append("하나")
strArray.append("둘")
strArray.append("하나")
C_Util().removeArrayStringOverlap(array: strArray)
// -----------------------------------------
3. 리턴 반환 : 중복 제거된 배열 데이터 반환 실시
// -----------------------------------------
*/
// [초기 리턴 데이터 변수 선언 실시]
var returnArray : Array<String> = []
// [인풋 데이터 널 체크 수행 실시]
if array != nil
&& array.count>0
&& array.isEmpty == false {
do {
// [Set 을 사용해 Array 배열 중복 데이터 제거 실시]
let arraySet : Set<String> = Set(array)
// [Set to Array 변환 수행 실시]
returnArray = Array(arraySet)
}
catch {
print("")
print("====================================")
print("[C_Util >> removeArrayStringOverlap() :: Array<String> 베열 중복 데이터 제거 실시]")
print("-------------------------------")
print("error :: \(error.localizedDescription)")
print("====================================")
print("")
}
}
// [로그 출력 실시]
print("")
print("====================================")
print("[C_Util >> removeArrayStringOverlap() :: Array<String> 베열 중복 데이터 제거 실시]")
print("-------------------------------")
print("input :: \(array.description)")
print("-------------------------------")
print("return :: \(returnArray.description)")
print("====================================")
print("")
// [리턴 데이터 반환 실시]
return returnArray
}
// MARK: - [String 문자열 데이터가 모두 정수 값으로 구성되어 있는지 확인 실시]
func stringIsNumber(string: String) -> Bool {
/*
// -----------------------------------------
[stringIsNumber 메소드 설명]
// -----------------------------------------
1. String 문자열 데이터가 모두 정수 값으로 구성되어 있는지 확인 실시
// -----------------------------------------
2. 호출 방법 :
C_Util().stringIsNumber(string: "12345")
C_Util().stringIsNumber(string: "-12345")
C_Util().stringIsNumber(string: "123hello")
// -----------------------------------------
3. 리턴 반환 : string 문자열 데이터가 모두 정수값으로 된 경우 true / 아니면 false
// -----------------------------------------
*/
// [초기 리턴 데이터 변수 선언 실시]
var returnData = true
// [인풋 데이터 널 체크 수행 실시]
if string != nil
&& string.count>0
&& string != ""
&& string.trimmingCharacters(in: .whitespacesAndNewlines) != ""
&& string.trimmingCharacters(in: .whitespacesAndNewlines) != "null"
&& string.isEmpty == false {
// [isNumber 사용해 정수값 체크 실시]
var count = 0
for _char in string {
if _char.isNumber == true { // [정수 값 인 경우]
}
else { // [정수 값이 아닌 경우]
if count == 0 && _char == "-" || _char == "+" { // [처음 문자가 - , + 인 경우는 통과 실시]
}
else {
// [리턴 변수에 삽입 실시]
returnData = false
}
}
count = count + 1
}
}
else {
// [리턴 변수에 삽입 실시]
returnData = false
}
// [로그 출력 실시]
print("")
print("====================================")
print("[C_Util >> stringIsNumber() :: string 문자열 데이터 모두 정수 값 구성 여부 확인 실시]")
print("-------------------------------")
print("input :: \(string)")
print("-------------------------------")
print("return :: \(returnData)")
print("====================================")
print("")
// [리턴 데이터 반환 실시]
return returnData
}
// MARK: - [Data 를 Byte 바이트 값 문자열로 리턴 실시]
func dataToByteString(data: Data) -> String {
/*
// -----------------------------------------
[dataToByteString 메소드 설명]
// -----------------------------------------
1. Data 를 Byte 바이트 값 문자열로 리턴 실시
// -----------------------------------------
2. 호출 방법 :
var dataValue : Data = Data()
dataValue.append(104)
dataValue.append(101)
dataValue.append(108)
dataValue.append(108)
dataValue.append(111)
C_Util().dataToByteString(data: dataValue)
// -----------------------------------------
3. 리턴 반환 : [104, 101, 108, 108, 111] 배열 형태 문자열
// -----------------------------------------
*/
// [초기 리턴 데이터 변수 선언 실시]
var returnData = ""
// [인풋 데이터 널 체크 수행 실시]
if data != nil
&& data.count>0
&& data.isEmpty == false {
// [바이트 배열 값 확인 실시]
returnData = "["
for i in stride(from: 0, through: data.count-1, by: 1) {
returnData += String(describing: data[i]) // [개별 바이트 값을 삽입]
if i != data.count-1 { // [배열 형태로 찍기 위함]
returnData += ", "
}
}
returnData += "]"
}
// [로그 출력 실시]
print("")
print("====================================")
print("[C_Util >> dataToByteString() :: Data 를 Byte 바이트 값 문자열로 리턴 실시]")
print("-------------------------------")
print("input [length] :: \(data)")
print("-------------------------------")
print("return [string] :: \(returnData)")
print("====================================")
print("")
// [리턴 데이터 반환 실시]
return returnData
}
// MARK: - [Double 소수점 데이터를 특정 소수점 자릿수 기준으로 자르기 실시]
func doubleCutLength(double: Double, length: Int) -> String {
/*
// -----------------------------------------
[doubleCutLength 메소드 설명]
// -----------------------------------------
1. Double 소수점 데이터를 특정 소수점 자릿수 기준으로 자르기 실시
// -----------------------------------------
2. 호출 방법 :
C_Util().doubleCutLength(double: 123.4567, length: 2)
C_Util().doubleCutLength(double: -123.4567, length: 2)
// -----------------------------------------
3. 리턴 반환 : 123.45 : 소수점 특정 자릿수 기준 제한 문자열 데이터
// -----------------------------------------
*/
// [초기 리턴 데이터 변수 선언 실시]
var returnData = ""
// [인풋 데이터 널 체크 수행 실시]
if double != nil
&& length != nil
&& length >= 0 {
// [인풋으로 들어온 double 데이터 확인 실시]
var strData = String(describing: double)
var strArray = Array(strData)
// [마이너스 값 체크 여부 플래스 정의]
var checkMinus = false
// [마이너스 데이터 값 체크 실시]
if strArray[0] == "-" {
checkMinus = true // [마이너스 시작 플래스 설정]
}
// [마이너스로 시작하는 경우]
if checkMinus == true {
strArray.remove(at: 0)
}
// [배열 데이터 값을 string 변환 실시]
strData = ""
for j in stride(from: 0, through: strArray.count-1, by: 1) {
strData = strData + strArray[j].description
}
// [for 문을 돌면서 . 점 개수 카운트 및 위치 확인 실시]
var dotCount = 0
var dotLocation = 0
var dotLength = 0
for i in stride(from: 0, through: strArray.count-1, by: 1) {
if strArray[i] == "." {
dotCount = dotCount + 1 // [. 점 개수 카운트 증가]
dotLocation = i // [점 위치값 지정 실시]
dotLength = strArray.count - (i + 1) // [소수점 이하 자리수 카운트 개수 확인]
}
}
/*
print("")
print("====================================")
print("[C_Util >> doubleCutLength() :: Double 소수점 데이터를 특정 소수점 자릿수 기준으로 자르기 실시]")
print("-------------------------------")
print("checkMinus [마이너스 값 여부] :: \(checkMinus)")
print("-------------------------------")
print("dotCount [점 개수] :: \(dotCount)")
print("-------------------------------")
print("dotLocation [점 위치] :: \(dotLocation)")
print("-------------------------------")
print("formatStrData [포맷 데이터] :: \(strData)")
print("====================================")
print("")
// */
// [점 개수 값을 확인해서 포맷 수행 실시]
if dotCount == 1 {
// [위치 값 재조절 실시]
dotLocation = dotLocation + length
// [NumberFomatter 을 사용해서 특정 자릿수 기준으로 포맷 실시]
let numberFomatter = NumberFormatter() // NumberFormatter 객체 생성
numberFomatter.roundingMode = .floor // 특정 자릿수 기준으로 버림 설정
numberFomatter.maximumSignificantDigits = dotLocation // 자르기를 원하는 자릿수 지정 실시
// [리턴 결과 변수에 삽입 실시]
returnData = numberFomatter.string(for: Double(strData) ?? 0)!
if checkMinus == true { // 마이너스 기호인 경우 최종 부호 추가
returnData = "-" + returnData
}
// [원본 데이터보다 더 많은 수 자리를 지정한 경우 0 으로 채움]
/*
print("")
print("====================================")
print("[C_Util >> doubleCutLength() :: Double 소수점 데이터를 특정 소수점 자릿수 기준으로 자르기 실시]")
print("-------------------------------")
print("소수점 이하 개수 :: \(dotLength)")
print("-------------------------------")
print("자르려는 소수점 자릿수 :: \(length)")
print("====================================")
print("")
// */
if length > dotLength {
let zeroCount = length - dotLength
for k in stride(from: 0, through: zeroCount-1, by: 1){
returnData = returnData + "0"
}
}
}
}
// [로그 출력 실시]
print("")
print("====================================")
print("[C_Util >> doubleCutLength() :: Double 소수점 데이터를 특정 소수점 자릿수 기준으로 자르기 실시]")
print("-------------------------------")
print("input [double] :: \(double)")
print("-------------------------------")
print("input [length] :: \(length)")
print("-------------------------------")
print("return [string] :: \(returnData)")
print("====================================")
print("")
// [리턴 데이터 반환 실시]
return returnData
}
// MARK: - [인풋으로 들어온 배열 데이터 중 부분 배열 데이터 반환 실시]
func arraySubList(list: Array<Any>, startIdx: Int, endIdx: Int) -> Array<Any> {
/*
// -----------------------------------------
[arraySubList 메소드 설명]
// -----------------------------------------
1. 인풋으로 들어온 배열 데이터 중 부분 배열 데이터 반환 실시
// -----------------------------------------
2. 호출 방법 :
// [배열 선언]
var anyArray : Array<Any> = []
// [배열에 데이터 삽입 실시]
anyArray.append("하나")
anyArray.append("둘")
anyArray.append("셋")
anyArray.append("넷")
anyArray.append("다섯")
// [유틸 파일 호출]
C_Util().arraySubList(list: anyArray, startIdx: 0, endIdx: anyArray.count-1) // [배열 전체 데이터]
C_Util().arraySubList(list: anyArray, startIdx: 1, endIdx: 3) // [배열 부분 데이터 : 1, 2, 3 인덱스 데이터 출력]
// -----------------------------------------
3. 리턴 반환 : [하나, 둘, 셋, 넷, 다섯] / [둘, 셋, 넷]
// -----------------------------------------
*/
// [초기 리턴 데이터 변수 선언 실시]
var returnData : Array<Any> = []
// [인풋 데이터 널 체크 수행 실시]
if list != nil && list.count>0 && list.isEmpty == false
&& startIdx >= 0 && startIdx <= endIdx
&& endIdx >= 0 && endIdx >= startIdx {
// [부분 데이터 범위 지정]
let subList = list[startIdx ..< (endIdx+1)]
/*
print("")
print("====================================")
print("[C_Util >> arraySubList() :: Array 부분 배열 데이터 반환 실시]")
print("-------------------------------")
print("input [list] :: \(list.description)")
print("input [startIdx] :: \(startIdx)")
print("input [endIdx] :: \(endIdx)")
print("-------------------------------")
print("subList [length] :: \(subList.count)")
print("subList [list] :: \(subList)")
print("====================================")
print("")
// */
// [리턴 변수에 삽입]
for i in stride(from: startIdx, through: endIdx, by: 1) {
returnData.append(subList[i])
}
}
// [로그 출력 실시]
print("")
print("====================================")
print("[C_Util >> arraySubList() :: Array 부분 배열 데이터 반환 실시]")
print("-------------------------------")
print("input [list] :: \(list.description)")
print("input [startIdx] :: \(startIdx)")
print("input [endIdx] :: \(endIdx)")
print("-------------------------------")
print("return [length] :: \(returnData.count)")
print("return [list] :: \(returnData)")
print("====================================")
print("")
// [리턴 데이터 반환 실시]
return returnData
}
// MARK: - [한국 시간 대로 24 시간 설정을 맞춰서 날짜 및 시간 데이터 반환]
func getNowKorDate24() -> String {
/*
// -----------------------------------------
[getNowKorDate24 메소드 설명]
// -----------------------------------------
1. 한국 시간 대로 24 시간 설정을 맞춰서 날짜 및 시간 데이터 반환
// -----------------------------------------
2. 호출 방법 : C_Util().getNowKorDate24()
// -----------------------------------------
3. 리턴 반환 : 20220413155123
// -----------------------------------------
*/
// [초기 리턴 데이터 변수 선언 실시]
var returnData = ""
// [한국 날짜 및 시간 데이터 반환 실시]
let date = Date()
let formatter = DateFormatter()
formatter.dateFormat = "yyyyMMddHHmmss" // 24 시간 대 설정
formatter.locale = Locale(identifier: "ko_kr") // 한국 시간 지정
formatter.timeZone = TimeZone(abbreviation: "KST") // 한국 시간대 지정
// [리턴 변수에 삽입 실시]
returnData = formatter.string(from: date) // string 형태
// [리턴 데이터가 모두 숫자로 구성되었는지 확인 실시]
var notNumber = false
for _char in returnData {
if _char.isNumber == false { // 정수 값이 아닌 경우
notNumber = true
}
}
if notNumber == true {
print("")
print("====================================")
print("[C_Util >> getNowKorDate24() :: 한국 시간 대로 24 시간 설정을 맞춰서 날짜 및 시간 데이터 반환]")
print("-------------------------------")
print("returnData :: \(returnData)")
print("-------------------------------")
print("notNumber :: \(notNumber)")
print("-------------------------------")
print("error :: 모두 숫자로 구성되어있지 않음")
print("====================================")
print("")
// [리턴 데이터 초기화]
returnData = ""
}
// [로그 출력 실시]
print("")
print("====================================")
print("[C_Util >> getNowKorDate24() :: 한국 시간 대로 24 시간 설정을 맞춰서 날짜 및 시간 데이터 반환]")
print("-------------------------------")
print("returnData [데이터] :: \(returnData)")
print("-------------------------------")
print("returnData [길이] :: \(returnData.count)")
print("====================================")
print("")
// [리턴 데이터 반환 실시]
return returnData
}
// MARK: - [배열 + 딕셔너리 데이터를 JsonArray + JsonObject 형태 String 문자열 데이터 반환 실시]
func arrayDic_To_jsonArrayInJsonObj_String(list: Array<Any>) -> String {
/*
// -----------------------------------------
[arrayDic_To_jsonArrayInJsonObj_String 메소드 설명]
// -----------------------------------------
1. 배열 + 딕셔너리 데이터를 JsonArray + JsonObject 형태 String 문자열 데이터 반환 실시
// -----------------------------------------
2. 호출 방법 :
// [배열 선언]
var anyArray : Array<Any> = []
// [딕셔너리 선언]
var dicData : Dictionary<String, Any> = [String : Any]()
dicData["name"] = "TWOK"
dicData["age"] = 29
// [배열에 딕셔너리 객체 삽입 실시]
anyArray.append(dicData)
// [유틸 파일 호출 실시]
C_Util().arrayDic_To_jsonArrayInJsonObj_String(list: anyArray)
// -----------------------------------------
3. 리턴 반환 :
return :: [
{
"age" : 29,
"name" : "TWOK"
}
]
// -----------------------------------------
*/
// [초기 리턴 데이터 변수 선언 실시]
var returnData = ""
// [인풋 데이터 널 체크 수행 실시]
if list != nil && list.count>0 && list.isEmpty == false {
do {
// [json 데이터 생성 실시]
let jsonCreate = try JSONSerialization.data(withJSONObject: list, options: .prettyPrinted)
returnData = String(data: jsonCreate, encoding: .utf8) ?? ""
} catch {
print("")
print("====================================")
print("[C_Util >> arrayDic_To_jsonArrayInJsonObj_String() :: [배열 + 딕셔너리] >> [JsonArray + JsonObject] 형태 String 문자열 반환]")
print("-------------------------------")
print("catch :: \(error.localizedDescription)")
print("====================================")
print("")
}
}
// [로그 출력 실시]
print("")
print("====================================")
print("[C_Util >> arrayDic_To_jsonArrayInJsonObj_String() :: [배열 + 딕셔너리] >> [JsonArray + JsonObject] 형태 String 문자열 반환]")
print("-------------------------------")
print("input :: \(list.description)")
print("-------------------------------")
print("return :: \(returnData)")
print("====================================")
print("")
// [리턴 데이터 반환 실시]
return returnData
}
// MARK: - [JsonArray + JsonObject 형태 String 데이터를 배열 + 딕셔너리 데이터로 반환 실시]
func jsonArrayInJsonObj_To_arrayDic(string: String) -> Array<Dictionary<String, Any>> {
/*
// -----------------------------------------
[jsonArrayInJsonObj_To_arrayDic 메소드 설명]
// -----------------------------------------
1. JsonArray + JsonObject 형태 String 데이터를 배열 + 딕셔너리 데이터로 반환 실시
// -----------------------------------------
2. 호출 방법 :
// [jsonArray 형식 문자열 선언 실시]
let jsonArrayString = "[\n" +
" {\n" +
" \"age\" : 29,\n" +
" \"name\" : \"TWOK\"\n" +
" }\n" +
"]"
// [유틸 파일 호출 실시]
C_Util().jsonArrayInJsonObj_To_arrayDic(string: jsonArrayString)
// -----------------------------------------
3. 리턴 반환 :
return :: [["name": TWOK, "age": 29]]
// -----------------------------------------
*/
// [초기 리턴 데이터 변수 선언 실시]
var returnData : Array<Dictionary<String, Any>> = []
// [인풋 데이터 널 체크 수행 실시]
if string != nil
&& string.count>0
&& string != ""
&& string.trimmingCharacters(in: .whitespacesAndNewlines) != ""
&& string.trimmingCharacters(in: .whitespacesAndNewlines) != "null"
&& string.isEmpty == false {
do {
// [jsonArray - jsonObject 형식 데이터를 Array 와 Dictionary 사용해서 받음]
returnData = try JSONSerialization.jsonObject(with: Data(string.utf8), options: []) as! Array<Dictionary<String, Any>>
}
catch {
print("")
print("====================================")
print("[C_Util >> jsonArrayInJsonObj_To_arrayDic() :: [JsonArray + JsonObject] 형태 String 데이터를 [배열 + 딕셔너리] 데이터로 반환]")
print("-------------------------------")
print("catch :: \(error.localizedDescription)")
print("====================================")
print("")
}
}
// [로그 출력 실시]
print("")
print("====================================")
print("[C_Util >> jsonArrayInJsonObj_To_arrayDic() :: [JsonArray + JsonObject] 형태 String 데이터를 [배열 + 딕셔너리] 데이터로 반환]")
print("-------------------------------")
print("input :: \(string)")
print("-------------------------------")
print("return :: \(returnData.description)")
print("====================================")
print("")
// [리턴 데이터 반환 실시]
return returnData
}
// MARK: - [Array 배열 데이터 교집합 수행 실시]
func arrayIntersect(array_1:Array<Any>, array_2:Array<Any>) -> Array<Any> {
/*
// -----------------------------------------
[arrayIntersect 메소드 설명]
// -----------------------------------------
1. Array 배열 데이터 교집합 수행 실시
// -----------------------------------------
2. 호출 방법 :
var anyArray_1 : Array<Any> = []
anyArray_1.append("하나")
anyArray_1.append("둘")
anyArray_1.append("셋")
var anyArray_2 : Array<Any> = []
anyArray_2.append("둘")
anyArray_2.append("셋")
anyArray_2.append("넷")
C_Util().arrayIntersect(array_1: anyArray_1, array_2: anyArray_2)
// -----------------------------------------
3. 리턴 반환 :
return :: ["둘", "셋"]
// -----------------------------------------
*/
// [초기 리턴 데이터 변수 선언 실시]
var returnData : Array<Any> = []
// [인풋 데이터 널 체크 수행 실시]
if array_1 != nil
&& array_1.count>0
&& array_1.isEmpty == false
&& array_2 != nil
&& array_2.count>0
&& array_2.isEmpty == false {
///*
// [for 문을 사용해서 일치하는 데이터 확인 실시]
for i in stride(from: 0, through: array_1.count-1, by: 1) {
for j in stride(from: 0, through: array_2.count-1, by: 1) {
if String(describing: array_1[i]) == String(describing: array_2[j]) {
// [리턴 배열에 삽입 실시]
returnData.append(array_1[i])
}
}
}
// */
}
// [로그 출력 실시]
print("")
print("====================================")
print("[C_Util >> arrayIntersect() :: Array 배열 데이터 교집합 수행 실시]")
print("-------------------------------")
print("input [array_1] :: \(array_1.description)")
print("-------------------------------")
print("input [array_2] :: \(array_2.description)")
print("-------------------------------")
print("return :: \(returnData.description)")
print("====================================")
print("")
// [리턴 데이터 반환 실시]
return returnData
}
// MARK: - [String 문자열 데이터가 URL 형식으로 파싱 가능 한지 체크 실시]
func stringIsUrlParsing(string: String) -> Bool {
/*
// -----------------------------------------
[stringIsUrlParsing 메소드 설명]
// -----------------------------------------
1. String 문자열 데이터가 URL 형식으로 파싱 가능 한지 체크 실시
// -----------------------------------------
2. 호출 방법 :
C_Util().stringIsUrlParsing(string: "https://www.naver.com") // [변경 가능]
C_Util().stringIsUrlParsing(string: "http://www.test.app?key=1234") // [변경 가능]
C_Util().stringIsUrlParsing(string: "http://www.test.app?key=yHfsatdJyL\r\n") // [변경 불가 : 엔터 값]
// -----------------------------------------
3. 리턴 반환 : URL 형식으로 변환 가능한 경우 true / 아니면 false 리턴
// -----------------------------------------
*/
// [초기 리턴 데이터 변수 선언 실시]
var returnData = false
// [인풋 데이터 널 체크 수행 실시]
if string != nil
&& string.count>0
&& string != ""
&& string != "null"
&& string.isEmpty == false {
// [URL 타입 선언 확인 실시]
do {
if let url = URL(string: string) { // [웹뷰 로드 주소 URL 체크]
let request = URLRequest(url: url) // [URLRequest 로 정상 변환 가능한지 확인]
// [리턴 변수에 삽입 실시]
returnData = true
}
else {
// [리턴 변수에 삽입 실시]
returnData = false
}
}
catch {
print("")
print("====================================")
print("[C_Util >> stringIsUrlParsing() :: String 문자열 데이터가 URL 형식으로 파싱 가능 한지 체크 실시]")
print("-------------------------------")
print("catch :: \(error.localizedDescription)")
print("====================================")
print("")
// [리턴 변수에 삽입 실시]
returnData = false
}
}
else {
// [리턴 변수에 삽입 실시]
returnData = false
}
// [로그 출력 실시]
print("")
print("====================================")
print("[C_Util >> stringIsUrlParsing() :: String 문자열 데이터가 URL 형식으로 파싱 가능 한지 체크 실시]")
print("-------------------------------")
print("input :: \(string)")
print("-------------------------------")
print("return :: \(returnData)")
print("====================================")
print("")
// [리턴 데이터 반환 실시]
return returnData
}
// MARK: - [파일 확장자 검사 수행 실시]
func urlFileExtensionName(string: String) -> String {
/*
// -----------------------------------------
[urlFileExtensionName 메소드 설명]
// -----------------------------------------
1. url 형식 주소에서 파일 확장자가 포함되었는지 확인
// -----------------------------------------
2. 호출 방법 :
C_Util().urlFileExtensionName(string: "http://img.championat.com/news/big/l/c/ujejn-runi_1439911080563855663.jpg")
// -----------------------------------------
3. 리턴 데이터 : 파일 확장자 포함하는 주소인 경우 확장자 명 리턴 / 아니면 null 리턴
jpg / null
// -----------------------------------------
4. 참고 [1] : html a 태그 소스 코드
<a href='f:http://img.championat.com/news/big/l/c/ujejn-runi_1439911080563855663.jpg' download="file"> 파일다운로드 </a>
// -----------------------------------------
5. 참고 [2] : 필수 호출 방식
a 태그 href 를 사용해 호출 할 경우 쿼리스트링 형태로 들어오면 안되고, 반드시 [주소/img.jpg] 처럼 경로 설정이 되어야함
// -----------------------------------------
*/
// [초기 리턴 데이터 변수 선언 실시]
var returnData = ""
// [인풋 데이터 널 체크 수행 실시]
if string != nil
&& string.count>0
&& string != ""
&& string != "null"
&& string.isEmpty == false
&& string.hasPrefix("http"){
// [URL 타입 선언 확인 실시]
guard let urlCheck = URL(string: string)
else {
print("")
print("====================================")
print("[C_Util >> urlFileExtensionName() :: URL 주소 파일 확장자 포함 확인 에러]")
print("-------------------------------")
print("error :: ", "URL 파싱 에러")
print("====================================")
print("")
return returnData
}
// [파일 확장자 및 이름 확인 실시]
var fileExtension = String(describing: urlCheck.pathExtension) // [jpg]
let fileName = String(describing: urlCheck.lastPathComponent) // [file.jpg]
// [리턴 결과 반환 실시]
returnData = fileExtension
// [파일 확장자명 종료 확인]
if fileExtension != nil && fileExtension.count>0 && fileExtension != "" {
}
else {
guard let lastEIndex = string.lastIndex(of: "/") else { fatalError() } // 마지막 / 문자 인덱스 위치
let endIndex = string.index(string.startIndex, offsetBy: string.count-1)
var files = String(string[lastEIndex...endIndex]) // 문자열 분리 실시
files = files.replacingOccurrences(of: "/", with: "") // 불필요 문자 제거
let arrays = files.components(separatedBy: ".")
if arrays != nil && arrays.isEmpty == false && arrays.count>0 && arrays.count == 2 { // [. 기준으로 정상적으로 분리가 된 경우]
fileExtension = arrays[1]
}
// [리턴 결과 반환 실시]
returnData = fileExtension
}
}
// [로그 출력 실시]
print("")
print("====================================")
print("[C_Util >> urlFileExtensionName() :: URL 주소 파일 확장자 포함 확인 실시]")
print("-------------------------------")
print("input :: \(string)")
print("-------------------------------")
print("return :: \(returnData)")
print("====================================")
print("")
// [리턴 데이터 반환 실시]
return returnData
}
// MARK: - [비동기 http 파일 다운로드 수행 실시]
func appDownloadFile(onView : UIView, fileUrl : String, completion: @escaping (Bool, String)->()) {
/*
// -----------------------------------------
[appDownloadFile 메소드 설명]
// -----------------------------------------
1. 파일 다운로드 수행 실시 메소드 (아이폰 >> 파일 폴더 >> 나의 iPhone >> 애플리케이션 >> 저장)
// -----------------------------------------
2. 호출 방법 :
C_Util().appDownloadFile(onView: self.view, fileUrl: "http://img.championat.com/news/big/l/c/ujejn-runi_1439911080563855663.jpg"){(result, msg) in
print("")
print("====================================")
print("[A_Main >> decidePolicyFor() :: 웹뷰 실시간 url 변경 감지]")
print("콜 백 :: 파일 다운로드 결과 확인")
print("result :: ", result)
print("msg :: ", msg)
print("====================================")
print("")
// [에러 메시지 분기 처리]
if result == true { // [정상]
}
else { // [실패]
}
}
// -----------------------------------------
3. 사전 설정 사항 :
- 필요 info plist 설정
[1] http 허용 : App Transport Security Settings >> Allow Arbitrary Loads >> YES
[2] 아이폰 파일 접근 설정 : Supports opening documents in place : YES
[3] 아이튠즈 공유 설정 : Application supports iTunes file sharing : YES
// -----------------------------------------
4. 로직 :
- 인풋으로 들어온 파일 주소 널 체크 수행 실시
- 현재 날짜 및 시간 확인 실시
- 파일 확장자 확인 실시
- 파일이 저장될 경로 설정 수행 실시
- URLSession 사용해 비동기 http 요청 및 파일 다운로드 수행 및 저장 실시
- 파일 저장 명칭은 현재 날짜 및 시간.확장자
// -----------------------------------------
5. 참고 : html a 태그 소스 코드
<a href='f:http://img.championat.com/news/big/l/c/ujejn-runi_1439911080563855663.jpg' download="file"> 파일다운로드 </a>
// -----------------------------------------
*/
// [인풋 데이터 널 체크 수행 실시]
if fileUrl != nil
&& fileUrl.count>0
&& fileUrl != ""
&& fileUrl != "null"
&& fileUrl.isEmpty == false
&& fileUrl.hasPrefix("http"){
// [URL 타입 선언 확인 실시]
guard let urlCheck = URL(string: fileUrl)
else {
print("")
print("====================================")
print("[C_Util >> appDownloadFile() :: URL 주소 파일 확장자 포함 확인 에러]")
print("-------------------------------")
print("error :: ", "URL 파싱 에러")
print("====================================")
print("")
// [콜백 반환]
completion(false, "[appDownloadFile] : url parsing error")
return
}
// [현재 날짜 및 시간 확인 실시]
let nowDate = Date() // 현재의 Date 날짜 및 시간
let dateFormatter = DateFormatter() // Date 포맷 객체 선언
dateFormatter.locale = Locale(identifier: "ko") // 한국 지정
dateFormatter.dateFormat = "yyyyMMddkkmmss" // Date 포맷 타입 지정
//dateFormatter.dateFormat = "kkmmss" // Date 포맷 타입 지정
let date_string = dateFormatter.string(from: nowDate) // 포맷된 형식 문자열로 반환
// [파일 확장자 및 이름 확인 실시]
var fileExtension = String(describing: urlCheck.pathExtension) // [jpg]
let fileOriginName = String(describing: urlCheck.lastPathComponent) // [file.jpg]
// [파일 확장자명 종료 확인]
if fileExtension != nil && fileExtension.count>0 && fileExtension != "" {
}
else {
guard let lastEIndex = fileUrl.lastIndex(of: "/") else { fatalError() } // 마지막 / 문자 인덱스 위치
let endIndex = fileUrl.index(fileUrl.startIndex, offsetBy: fileUrl.count-1)
var files = String(fileUrl[lastEIndex...endIndex]) // 문자열 분리 실시
files = files.replacingOccurrences(of: "/", with: "") // 불필요 문자 제거
let arrays = files.components(separatedBy: ".")
if arrays != nil && arrays.isEmpty == false && arrays.count>0 && arrays.count == 2 { // [. 기준으로 정상적으로 분리가 된 경우]
// [변수에 삽입 실시]
fileExtension = arrays[1]
}
}
// [최종 파일 명칭 확인 실시]
if fileExtension != nil && fileExtension.count>0 && fileExtension != "" {
// [현재 날짜 및 시간 + 파일 확장자 데이터 결합 실시]
let fileName = date_string + "." + fileExtension
// [파일이 저장될 경로 설정 실시]
let fileManager = FileManager.default // 파일 매니저 선언
let documentsUrl = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first! // 기본 경로 확인
let fileSavePath = documentsUrl.appendingPathComponent(fileName) // 실제 저장되는 경로
// [http 비동기 방식을 사용해서 파일 다운로드 및 저장 수행 실시]
var urlComponents = URLComponents(string: fileUrl)
var requestURL = URLRequest(url: (urlComponents?.url)!)
requestURL.httpMethod = "GET" // GET
requestURL.addValue("application/x-www-form-urlencoded; charset=utf-8;", forHTTPHeaderField: "Content-Type") // GET
print("")
print("====================================")
print("[C_Util >> appDownloadFile() :: http 통신 파일 다운로드 요청 실시]")
print("-------------------------------")
print("주 소 :: ", requestURL)
print("-------------------------------")
print("파일 저장 경로 :: ", fileSavePath)
print("====================================")
print("")
// [http 요쳥을 위한 URLSessionDataTask 생성]
let dataTask = URLSession.shared.dataTask(with: requestURL, completionHandler: { (data, response, error) in
// [error가 존재하면 종료]
guard error == nil else {
print("")
print("====================================")
print("[C_Util >> appDownloadFile() :: http 통신 파일 다운로드 요청 실패]")
print("-------------------------------")
print("주 소 :: ", requestURL)
print("-------------------------------")
print("fail :: ", error?.localizedDescription ?? "")
print("====================================")
print("")
// [콜백 반환]
completion(false, error?.localizedDescription ?? "")
return
}
// [status 코드 체크 실시]
let successsRange = 200..<300
guard let statusCode = (response as? HTTPURLResponse)?.statusCode, successsRange.contains(statusCode)
else {
print("")
print("====================================")
print("[C_Util >> appDownloadFile() :: http 통신 파일 다운로드 요청 에러]")
print("-------------------------------")
print("주 소 :: ", requestURL)
print("-------------------------------")
print("error :: ", (response as? HTTPURLResponse)?.statusCode ?? 0)
print("-------------------------------")
print("msg :: ", (response as? HTTPURLResponse)?.description ?? "")
print("====================================")
print("")
// [콜백 반환]
completion(false, (response as? HTTPURLResponse)?.description ?? "")
return
}
// [response 데이터 획득]
let resultCode = (response as? HTTPURLResponse)?.statusCode ?? 0
let resultLen = data! // 데이터 길이
print("")
print("====================================")
print("[C_Util >> appDownloadFile() :: http 통신 파일 다운로드 성공]")
print("-------------------------------")
print("주 소 :: ", requestURL)
print("-------------------------------")
print("resultCode :: ", resultCode)
print("-------------------------------")
print("resultLen :: ", resultLen)
print("====================================")
print("")
// [파일 저장 수행 실시]
if let data = data {
// [설정한 경로에 파일 저장]
if let _ = try? data.write(to: fileSavePath, options: Data.WritingOptions.atomic) {
print("")
print("====================================")
print("[C_Util >> appDownloadFile() :: http 통신 파일 저장 [성공]]")
print("-------------------------------")
print("파일 저장 경로 :: ", fileSavePath)
print("====================================")
print("")
// [콜백 반환]
completion(true, "[appDownloadFile] : File Download Success")
}
else {
print("")
print("====================================")
print("[C_Util >> appDownloadFile() :: http 통신 파일 저장 [실패] [1]]")
print("-------------------------------")
print("파일 저장 경로 :: ", fileSavePath)
print("-------------------------------")
print("error :: ", "data write error")
print("====================================")
print("")
// [콜백 반환]
completion(false, "[appDownloadFile] : data write error")
}
}
else {
print("")
print("====================================")
print("[C_Util >> appDownloadFile() :: http 통신 파일 저장 [실패] [2]]")
print("-------------------------------")
print("파일 저장 경로 :: ", fileSavePath)
print("-------------------------------")
print("error :: ", "data parsing error")
print("====================================")
print("")
// [콜백 반환]
completion(false, "[appDownloadFile] : data parsing error")
}
})
// [network 통신 실행]
dataTask.resume()
}
else {
print("")
print("====================================")
print("[C_Util >> appDownloadFile() :: http 통신 파일 다운로드 요청 에러]")
print("-------------------------------")
print("error :: ", "file extension is null")
print("====================================")
print("")
// [콜백 반환]
completion(false, "[appDownloadFile] : file extension is null")
return
}
}
else {
// [콜백 반환]
completion(false, "[appDownloadFile] : Input data is null")
}
}
// MARK: - [LPAD 왼쪽 기준 데이터 채우기 수행 실시]
func LPAD(string: String, length:Int, char:String) -> String {
/*
// -----------------------------------------
[LPAD 메소드 설명]
// -----------------------------------------
1. 왼쪽 기준 데이터 채우기 수행 실시
// -----------------------------------------
2. 호출 방법 :
C_Util().LPAD(string: "투케이", length:10, char:"@")
// -----------------------------------------
3. 리턴 데이터 : @@@@@@@투케이
// -----------------------------------------
*/
// [초기 리턴 데이터 변수 선언 실시]
var returnData = ""
// [인풋 데이터 조건 체크 수행 실시 : 원본 문자열 길이 보다 인풋 값 길이가 더크고, char 문자가 1글자 인 경우]
if string != nil && string.count < length
&& char != nil && char.count == 1 {
/*
print("")
print("====================================")
print("[C_Util >> LPAD() :: 왼쪽 기준 데이터 채우기 수행 [조건 만족]]")
print("====================================")
print("")
// */
// [반복문을 수행 횟수]
let countValue = length - string.count
// [반복문 수행 실시]
for i in stride(from: 0, through: countValue-1, by: 1) {
// [문자 추가]
returnData = returnData + char
}
// [원본 추가]
returnData = returnData + string
}
else {
/*
print("")
print("====================================")
print("[C_Util >> LPAD() :: 왼쪽 기준 데이터 채우기 수행 [조건 안됨]]")
print("====================================")
print("")
// */
// [리턴 결과 반환 실시]
returnData = string
}
// [로그 출력 실시]
print("")
print("====================================")
print("[C_Util >> LPAD() :: 왼쪽 기준 데이터 채우기 수행 실시]")
print("-------------------------------")
print("input [string] :: \(string)")
print("-------------------------------")
print("input [length] :: \(length)")
print("-------------------------------")
print("input [char] :: \(char)")
print("-------------------------------")
print("return [string] :: \(returnData)")
print("-------------------------------")
print("return [length] :: \(returnData.count)")
print("====================================")
print("")
// [리턴 데이터 반환 실시]
return returnData
}
// MARK: - [RPAD 왼쪽 기준 데이터 채우기 수행 실시]
func RPAD(string: String, length:Int, char:String) -> String {
/*
// -----------------------------------------
[RPAD 메소드 설명]
// -----------------------------------------
1. 오른쪽 기준 데이터 채우기 수행 실시
// -----------------------------------------
2. 호출 방법 :
C_Util().RPAD(string: "투케이", length:10, char:"@")
// -----------------------------------------
3. 리턴 데이터 : 투케이@@@@@@@
// -----------------------------------------
*/
// [초기 리턴 데이터 변수 선언 실시]
var returnData = ""
// [인풋 데이터 조건 체크 수행 실시 : 원본 문자열 길이 보다 인풋 값 길이가 더크고, char 문자가 1글자 인 경우]
if string != nil && string.count < length
&& char != nil && char.count == 1 {
/*
print("")
print("====================================")
print("[C_Util >> RPAD() :: 오른쪽 기준 데이터 채우기 수행 [조건 만족]]")
print("====================================")
print("")
// */
// [반복문을 수행 횟수]
let countValue = length - string.count
// [원본 추가]
returnData = returnData + string
// [반복문 수행 실시]
for i in stride(from: 0, through: countValue-1, by: 1) {
// [문자 추가]
returnData = returnData + char
}
}
else {
/*
print("")
print("====================================")
print("[C_Util >> RPAD() :: 오른쪽 기준 데이터 채우기 수행 [조건 안됨]]")
print("====================================")
print("")
// */
// [리턴 결과 반환 실시]
returnData = string
}
// [로그 출력 실시]
print("")
print("====================================")
print("[C_Util >> RPAD() :: 오른쪽 기준 데이터 채우기 수행 실시]")
print("-------------------------------")
print("input [string] :: \(string)")
print("-------------------------------")
print("input [length] :: \(length)")
print("-------------------------------")
print("input [char] :: \(char)")
print("-------------------------------")
print("return [string] :: \(returnData)")
print("-------------------------------")
print("return [length] :: \(returnData.count)")
print("====================================")
print("")
// [리턴 데이터 반환 실시]
return returnData
}
// MARK: - [start 시작 기준 특정 문자 지우기 실시]
func startRemoveChar(string: String, char: String) -> String {
/*
// -----------------------------------------
[startRemoveChar 메소드 설명]
// -----------------------------------------
1. start 시작 기준 특정 문자 지우기 실시
// -----------------------------------------
2. 호출 방법 : C_Util().startRemoveChar(string: "@@@@@투케이@", char: "@")
// -----------------------------------------
3. 리턴 반환 : 투케이@
// -----------------------------------------
*/
// [초기 리턴 데이터 변수 선언 실시]
var returnData = ""
// [인풋 데이터 널 체크 수행 실시]
if string != nil
&& string.count>0
&& string != ""
&& string.trimmingCharacters(in: .whitespacesAndNewlines) != ""
&& string.trimmingCharacters(in: .whitespacesAndNewlines) != "null"
&& string.isEmpty == false
&& char != nil
&& char.count>0
&& char != ""
&& char.trimmingCharacters(in: .whitespacesAndNewlines) != ""
&& char.trimmingCharacters(in: .whitespacesAndNewlines) != "null"
&& char.isEmpty == false {
// [전체 문자열에서 특정 문자를 포함하는지 확인 실시]
if string.contains(char) == true {
// [플래그 값 지정 실시]
var stopFlag = false
// [for 반복문을 돌면서 데이터 삽입 실시]
for i in stride(from: 0, through: string.count-1, by: 1) {
let charIndex = string.index(string.startIndex, offsetBy: i)
let charData = string[charIndex]
// [문자열기 제거하려는 문자와 같은 경우]
if String(describing: charData) == char {
if stopFlag == false {
}
else {
// [리턴 변수에 삽입 실시]
returnData = returnData + String(describing: charData)
}
}
else {
// [플래그 값 변경 실시]
stopFlag = true
// [리턴 변수에 삽입 실시]
returnData = returnData + String(describing: charData)
}
}
}
}
// [로그 출력 실시]
//*
print("")
print("====================================")
print("[C_Util >> startRemoveChar() :: start 시작 기준 특정 문자 지우기 실시]")
print("-------------------------------")
print("input [string] :: \(string)")
print("-------------------------------")
print("input [char] :: \(char)")
print("-------------------------------")
print("return [string] :: \(returnData)")
print("====================================")
print("")
// */
// [리턴 데이터 반환 실시]
return returnData
}
// MARK: - [end 종료 기준 특정 문자 지우기 실시]
func endRemoveChar(string: String, char: String) -> String {
/*
// -----------------------------------------
[endRemoveChar 메소드 설명]
// -----------------------------------------
1. end 종료 기준 특정 문자 지우기 실시
// -----------------------------------------
2. 호출 방법 : C_Util().endRemoveChar(string: "@투케이@@@@@", char: "@")
// -----------------------------------------
3. 리턴 반환 : @투케이
// -----------------------------------------
*/
// [초기 리턴 데이터 변수 선언 실시]
var returnData = ""
// [인풋 데이터 널 체크 수행 실시]
if string != nil
&& string.count>0
&& string != ""
&& string.trimmingCharacters(in: .whitespacesAndNewlines) != ""
&& string.trimmingCharacters(in: .whitespacesAndNewlines) != "null"
&& string.isEmpty == false
&& char != nil
&& char.count>0
&& char != ""
&& char.trimmingCharacters(in: .whitespacesAndNewlines) != ""
&& char.trimmingCharacters(in: .whitespacesAndNewlines) != "null"
&& char.isEmpty == false {
// [전체 문자열에서 특정 문자를 포함하는지 확인 실시]
if string.contains(char) == true {
// [플래그 값 지정 실시]
var stopFlag = false
// [for 반복문을 돌면서 데이터 삽입 실시]
for i in stride(from: string.count-1, through: 0, by: -1) {
let charIndex = string.index(string.startIndex, offsetBy: i)
let charData = string[charIndex]
// [문자열기 제거하려는 문자와 같은 경우]
if String(describing: charData) == char {
if stopFlag == false {
}
else {
// [리턴 변수에 삽입 실시]
returnData = String(describing: charData) + returnData
}
}
else {
// [플래그 값 변경 실시]
stopFlag = true
// [리턴 변수에 삽입 실시]
returnData = String(describing: charData) + returnData
}
}
}
}
// [로그 출력 실시]
//*
print("")
print("====================================")
print("[C_Util >> endRemoveChar() :: end 종료 기준 특정 문자 지우기 실시]")
print("-------------------------------")
print("input [string] :: \(string)")
print("-------------------------------")
print("input [char] :: \(char)")
print("-------------------------------")
print("return [string] :: \(returnData)")
print("====================================")
print("")
// */
// [리턴 데이터 반환 실시]
return returnData
}
// MARK: - [디바이스 소프트웨어 OS 버전 확인]
func getDeviceOsVersion() -> String {
/*
// -----------------------------------------
[getDeviceOsVersion 메소드 설명]
// -----------------------------------------
1. 디바이스 소프트웨어 OS 버전 확인 실시
// -----------------------------------------
2. 호출 방법 :
C_Util().getDeviceOsVersion()
// -----------------------------------------
3. 리턴 데이터 : 휴대폰 설정 디바이스 소프트웨어 OS 버전 리턴
// -----------------------------------------
*/
// [리턴 데이터 변수 선언 실시]
let returnData = String(describing: UIDevice.current.systemVersion)
// [로그 출력 실시]
print("")
print("====================================")
print("[C_Util >> getDeviceOsVersion() :: 디바이스 소프트웨어 OS 버전 확인 실시]")
print("-------------------------------")
print("return :: \(returnData)")
print("====================================")
print("")
// [리턴 데이터 반환 실시]
return returnData
}
// MARK: - [특정 문자열 시작 위치 확인 실시]
func getStringStartIndex(string:String, search:String) -> String {
/*
// -----------------------------------------
[getStringStartIndex 메소드 설명]
// -----------------------------------------
1. 특정 문자열 시작 인덱스 위치 확인 실시
// -----------------------------------------
2. 호출 방법 :
C_Util().getStringStartIndex(string:"Hello 안녕 2K 반가워", search:"Hello")
C_Util().getStringStartIndex(string:"Hello 안녕 2K 반가워", search:"2K")
// -----------------------------------------
3. 리턴 데이터 :
인덱스 시작 위치 값 (Hello = 0)
인덱스 시작 위치 값 (2K = 9)
// -----------------------------------------
*/
// [초기 리턴 데이터 변수 선언 실시]
var returnData = ""
// [인풋 데이터 널 체크 수행 실시]
if string != nil
&& string.count>0
&& string != ""
&& string.trimmingCharacters(in: .whitespacesAndNewlines) != ""
&& string.trimmingCharacters(in: .whitespacesAndNewlines) != "null"
&& string.isEmpty == false
&& search != nil
&& search.count>0
&& search != ""
&& search.trimmingCharacters(in: .whitespacesAndNewlines) != ""
&& search.trimmingCharacters(in: .whitespacesAndNewlines) != "null"
&& search.isEmpty == false {
// [contains 를 사용해 문자 포함 확인]
if (string.contains(search) == true){
// [split 을 사용해 특정 문자열 기준으로 분리 실시]
let arrayData = string.components(separatedBy: search)
// [문자열 길이 추출]
let lengthCheck = String(describing: arrayData[0].count)
/*
print("")
print("====================================")
print("[C_Util >> getStringStartIndex() :: 특정 문자열 시작 인덱스 위치 확인 실시]")
print("-------------------------------")
print("arrayData[0] :: \(arrayData[0])")
print("====================================")
print("")
// */
// [리턴 변수에 삽입]
returnData = lengthCheck
}
}
// [로그 출력 실시]
print("")
print("====================================")
print("[C_Util >> getStringStartIndex() :: 특정 문자열 시작 인덱스 위치 확인 실시]")
print("-------------------------------")
print("input [string] :: \(string)")
print("-------------------------------")
print("input [search] :: \(search)")
print("-------------------------------")
print("return [index] :: \(returnData)")
print("====================================")
print("")
// [리턴 데이터 반환 실시]
return returnData
}
// MARK: - [디바이스 기기 모델 이름 확인]
func getDeviceModelName() -> String {
/*
// -----------------------------------------
[getDeviceModelName 메소드 설명]
// -----------------------------------------
1. 디바이스 기기 모델 이름 확인 실시
// -----------------------------------------
2. 호출 방법 :
C_Util().getDeviceModelName()
// -----------------------------------------
3. 리턴 데이터 :
iPhone XS / iPhone 11
// -----------------------------------------
*/
// [초기 리턴 데이터 변수 선언 실시]
var modelName = ""
// [1]. 시뮬레이터 체크 수행 실시
modelName = ProcessInfo.processInfo.environment["SIMULATOR_DEVICE_NAME"] ?? ""
if modelName != nil && modelName.isEmpty == false && modelName.count>0 {
print("")
print("====================================")
print("[C_Util >> getDeviceModelName() :: 디바이스 시뮬레이터]")
print("-------------------------------")
print("deviceModelName :: \(modelName)")
print("====================================")
print("")
// [리턴 반환 실시]
return modelName
}
// [2]. 실제 디바이스 체크 수행 실시
let device = UIDevice.current
let selName = "_\("deviceInfo")ForKey:"
let selector = NSSelectorFromString(selName)
if device.responds(to: selector) { // [옵셔널 체크 실시]
modelName = String(describing: device.perform(selector, with: "marketing-name").takeRetainedValue())
}
// [로그 출력 실시]
print("")
print("====================================")
print("[C_Util >> getDeviceModelName() :: 디바이스 기기 모델 명칭 확인]")
print("-------------------------------")
print("return :: \(modelName)")
print("====================================")
print("")
// [리턴 반환 실시]
return modelName
}
// MARK: - [프로젝트에 추가된 텍스트 파일 읽기 수행 : Bundle.main.path]
func readBundleTextFile(path:String) -> String {
/*
// -----------------------------------------
[readBundleTextFile 메소드 설명]
// -----------------------------------------
1. 프로젝트에 추가된 텍스트 파일 읽기 수행 : Bundle.main.path
// -----------------------------------------
2. 호출 방법 :
C_Util().readBundleTextFile(path: "test.txt")
// -----------------------------------------
3. 리턴 데이터 :
hello
// -----------------------------------------
*/
// [리턴 변수 선언 실시]
var returnData = ""
// [사전 path 값 널 체크 수행]
if path != nil && path.isEmpty == false && path.count > 0 && path != ""
&& path.trimmingCharacters(in: .whitespacesAndNewlines) != ""
&& path.trimmingCharacters(in: .whitespacesAndNewlines) != "null"{
if let file = Bundle.main.path(forResource: path, ofType: nil) {
// [파일 읽기 수행 실시]
do {
returnData = try String(contentsOfFile: file, encoding: .utf8)
}
catch {
print("")
print("====================================")
print("[C_Util >> readBundleTextFile() :: File Read Error]")
print("error :: \(error.localizedDescription)")
print("====================================")
print("")
}
}
else {
print("")
print("====================================")
print("[C_Util >> readBundleTextFile() :: Bundle.main.path Check Error]")
print("====================================")
print("")
}
}
else {
print("")
print("====================================")
print("[C_Util >> readBundleTextFile() :: File Path Is Null]")
print("====================================")
print("")
}
// [로그 출력 실시]
print("")
print("====================================")
print("[C_Util >> readBundleTextFile() :: 텍스트 파일 읽기 수행 실시]")
print("-------------------------------")
print("input :: \(path)")
print("-------------------------------")
print("return :: \(returnData)")
print("====================================")
print("")
// [리턴 반환 실시]
return returnData
}
} // [클래스 종료]
반응형
'투케이2K 유틸파일' 카테고리의 다른 글
Comments