FileManager: Liste aller Dateien im Verzeichnis und aller Unterverzeichnisse
extension String {
func listAllFilesInSubAndDirectory() -> NSMutableArray {
let path = self
//interne Function
func dirList(path: String, list:NSMutableArray) {
let fileManager = FileManager.default
var isDir : ObjCBool = false
//prüfen, ob vorhanden und ein Directory
if fileManager.fileExists(atPath: path, isDirectory:&isDir) {
//file exist
if isDir.boolValue {
// file is a directory
do {
//list a directory
let contentsList = try fileManager.contentsOfDirectory(atPath: path)
//alle Elemente der Liste auf directorys untersuchen
//das geht am besten, in dem sich die Funktion selbst aufruft. Das ist dann die REKURSION
for element in contentsList {
let subPath = "\(path)/\(element)"
dirList(path: subPath, list: list)
}
} catch {
log.msg("Error while enumerating files \(path): \(error.localizedDescription)")
}
} else {
// file is not a directory
// .DS_Store soll nicht mit ausgegeben werden
if path.isSubstring(substring: ".DS_Store") == false {
//Ergebnis in den Pointer schreiben
list.add(path)
}
} //end if isDir.boolValue
} //end if fileManager.fileExists
}// func dirList
let list = NSMutableArray()
dirList(path: path, list: list)
return list
}
}
Beispiel:
log.msg("DirDist: \("/Users/karsten/Documents/TestLib".listAllFilesInSubAndDirectory())")
Ergebnis:
"/Users/karsten/Documents/TestLib/A3/B1/C1/File4.pdf",
"/Users/karsten/Documents/TestLib/A2/B2/File3.pdf",
"/Users/karsten/Documents/TestLib/A2/B1/File2.pdf",
"/Users/karsten/Documents/TestLib/File0.pdf",
"/Users/karsten/Documents/TestLib/A1/File1.pdf"
enum Quellcode: lesbarer gestalten
//Definition:
enum sections: Int {
case DEVICEdata = 0
case COUNTERdata = 1
case READINGTEXT = 2
case READINGNOTES = 3
}
//Anwendungsbeispiel:
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
switch indexPath.section {
case sections.DEVICEdata.rawValue:
return 200
case sections.COUNTERdata.rawValue:
return 120
case sections.READINGTEXT.rawValue:
return 64
case sections.READINGNOTES.rawValue:
return 46
default:
return 0
}
}
NSAlert auf Button reagieren
let alert = NSAlert()
alert.messageText = "Löschen?"
alert.informativeText = "Soll \("irgend etwas") aus der Datenbank gelöscht werden?"
alert.addButton(withTitle: "Abbrechen")
alert.addButton(withTitle: "Ja")
//alert.addButtonWithTitle("Don't Save")
let result = alert.runModal()
switch(result) {
case NSAlertFirstButtonReturn:
log.msg("Cancel")
case NSAlertSecondButtonReturn:
log.msg("Yes")
case NSAlertThirdButtonReturn:
log.msg("...")
default:
break
}
NSTableView aktualisieren und Reselect auf aktuelle Position
extension NSTableView {
func selectRow(at index: Int) {
//Zeile im NSTableView selektieren
selectRowIndexes(.init(integer: index), byExtendingSelection: false)
if let action = action {
perform(action)
}
//Selektierte Zeile in den sichtbaren Bereich des Views scrollen
scrollRowToVisible(index)
}
func refresh(){
//Tabelleninhalt aktualisieren und Reselect des selektierten Datensatzes
if selectedRow >= 0 {
let myRow = selectedRow
reloadData()
selectRow(at: myRow)
} else {
reloadData()
}
}
func refresh(at index: Int){
//Der Tabelleninhalt wird aktualisiert
//Ist der index>=0 soll der Datensatz mit dem Index selektiert werden. Meistens nach einem neuen Datenbankdatensatz nach insert. Der Index muß zuvor ermittelt werden
//gibt es keinen neuen Datensatz, wird der zuvor selektierte Datensatz wieder selektiert. Ist kein Datensatz selektiert, wird nur der Tabelleninhalt aktualisiert
if index>=0 {
reloadData()
selectRow(at: index)
} else {
if selectedRow >= 0 {
let myRow = selectedRow
reloadData()
selectRow(at: myRow)
} else {
reloadData()
}
}
}
}
Aufruf der Funktion im Beispiel
let sqlResult = sqlCube.execute("insert into Table ... ", commit: true)
if sqlResult.lastId>0 {
for (index, record) in sqlResult.result.enumerated() {
//Datenfeld PK ist die lastId
if ((record as! NSMutableDictionary)["PK"] as! String).int() == sqlResult.lastId {
tableTarifgebiete.refresh(at: index)
}
}
} else {
tableTarifgebiete.refresh()
}
Floats formatiert und gerundet als String ausgeben
extension Float {
func roundToString(digits: Int, roundingMode: CFNumberFormatterRoundingMode, numberStyle: CFNumberFormatterStyle ) -> String? {
//formatierte Ausgabe von Zahlen
let formatter = NumberFormatter()
formatter.roundingMode = NumberFormatter.RoundingMode(rawValue: UInt(roundingMode.hashValue))!
formatter.numberStyle = NumberFormatter.Style(rawValue: UInt(numberStyle.hashValue))!
formatter.maximumFractionDigits = digits
formatter.minimumFractionDigits = digits
formatter.minimumIntegerDigits = 1
return formatter.string(from: self as NSNumber)
}
}
Aufruf der Funktion und Ausgabe in der Konsole:
let t: Float = 1234.2355678
log.msg("Ausgabe: \(t.roundToString(digits: 2, roundingMode: CFNumberFormatterRoundingMode.roundHalfEven, numberStyle: CFNumberFormatterStyle.decimalStyle)! )")
Ausführliches Logging in der Konsole
class log {
class func msg(_ message: String, functionName: String = #function, fileNameWithPath: String = #file, lineNumber: Int = #line, columnNumber: Int = #column ) {
#if DEBUG
let output = "\(core.stringFromDateWithFormat(3, datum: Date() ))| \(lineNumber) \(functionName): \(message) "
print(output)
#endif
}
}
Aufruf der Funktion und Ausgabe in der Konsole:
Copy of NSDictionary or NSMutableDictionary
// *** user ist ein mutableDictionary mit Daten ***
let user:NSMutableDictionary = userRecord as! NSMutableDictionary
// *** resultDict ist ein mutableDictionary mit einer Kopie der Daten aus user***
// ist in Schleifen wichtig, da ansonsten der Zeiger übergeben wird.
let resultDict:NSMutableDictionary = user.mutableCopy() as! NSMutableDictionary
result.add(resultDict)
Einfache Klasse für Demozwecke
class Creatures {
var type: String
var things: [String]
init(type: String, things: [String]) {
self.type = type
self.things = things
}
}
var settings = [objectsInSection]()
// Do any additional setup after loading the view.
let creatureDict = ["Animals": ["Cat", "Dog", "Horse"],
"Birds": ["Eagle", "Hawk"],
"Fish": ["Cod", "Mackeral", "Salmon", "Tilapia"]]
for (type, things) in creatureDict {
let aCreatureList = Creatures(type: type, things: things)
creatures.append(aCreatureList)
}
log.msg("creatures.count: \(creatures.count)")
log.msg("creatures: \(creatures)")