MD5 eines Strings erstellen und als Id nutzen

Da Swift standardmäßig keine MD5-Funktion anbietet, muss man sich mit einem kleinen Trick in Form einer Extension weiterhelfen:

// Create a MD5 out of a String
extension String  {
    var md5: String! {
        let str = self.cStringUsingEncoding(NSUTF8StringEncoding)
        let strLen = CC_LONG(self.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))
        let digestLen = Int(CC_MD5_DIGEST_LENGTH)
        let result = UnsafeMutablePointer<CUnsignedChar>.alloc(digestLen)
        CC_MD5(str!, strLen, result)
        let hash = NSMutableString()
        for i in 0..<digestLen {
            hash.appendFormat("%02x", result[i])
        }
        result.destroy()
        return String(format: hash as String)
    }
}

Wichtig:
Damit auf Typen wie CC_Long, CC_MD5 etc. zugegriffen werden kann, muss ein Bridging-Header erstellt werden, in dem folgende Codezeile stehen muss:
#import <CommonCrypto/CommonCrypto.h>

Der MD5-Hash kann z.B. verwendet werden, um für die entsprechenden Strings Ids zu vergeben (Objekte, Dictionaries, Arrays, …). Dies bietet sich an, da normale Objekt-Ids auch Slashes enthalten können, was bei Abfragen zu Problemen führen kann.
Aber aufgepasst: Die folgenden beiden Schreibweisen (für die selbe Objekt-Id!) ergeben unterschiedliche MD5-Strings:
let md5_1 = objectID.description.md5
let md5_2 = „\(objectID.description)“.md5

Ermitteln des aktuellen Zoom-Levels einer MapView

Um den aktuellen Zoom-Level einer MapView zu ermitteln, kann folgende Funktion genutzt werden:

// Get the current zoom level of the map
// mRect = self.map.visibleMapRect
// viewSizeInPixel = self.map.frame.size
func getZoomLevel(mRect: MKMapRect, viewSizeInPixel: CGSize) -> Int {
  let MAX_ZOOM = 20 // 20 is the maximum zoomlevel with MapKit
  var zoomLevel: Int = MAX_ZOOM
  let zoomScale: MKZoomScale = CGFloat(mRect.size.width) / viewSizeInPixel.width
  let zoomExponent: Double = log2(Double(zoomScale))

  zoomLevel = Int(MAX_ZOOM - ceil(zoomExponent))
  return zoomLevel
}

Die Original-Funktion (in Objective-C geschrieben) gibt es bei Stack Overflow, lediglich der Funktionsname wurde angepasst.

MapKit: Neue Koordinaten berechnen

Wer mit MapKit arbeitet und Koordinaten berechnen möchte, die z.B. xy Meter weit von bestehenden Koordinaten weg sind (die man z.B. durch eine Touch-Geste bekommen hat), der kann folgende Funktion nutzen:

    // Calculate new coordinates that are xy meters away from old coordinates
    func calculateNewCoordinatesByDistance(oldCoordinates: CLLocationCoordinate2D, latDistanceInMeter: Double, longDistanceInMeter: Double) -> CLLocationCoordinate2D? {
        var newCoordinates = CLLocationCoordinate2D()

        let tempRegion: MKCoordinateRegion = MKCoordinateRegionMakeWithDistance(oldCoordinates, latDistanceInMeter, longDistanceInMeter)
        let tempSpan: MKCoordinateSpan = tempRegion.span

        newCoordinates.latitude = oldCoordinates.latitude + tempSpan.latitudeDelta
        newCoordinates.longitude = oldCoordinates.longitude + tempSpan.longitudeDelta

        return newCoordinates
    }

Die Originalfunktion (in Objective-C) gibt es auf Stack Overflow, allerdings wurden die Variablennamen noch etwas sprechender gemacht.

Swift vs. Objective-C

Vor kurzem bin ich wieder über einen Artikel gestoßen, der 10 Vorteile von Swift gegenüber Objective-C hervorhebt (und der vor allem für Querein- und Umsteiger in der iOS-Entwicklung interessant sein könnte). Da dieser sehr schön und einfach zu lesen ist, möchte ich ihn nicht vorenthalten. Zusammengefasst bietet Swift dabei folgende Verbesserung gegenüber seinem Vorgänger:
Swift vs. Objective-C weiterlesen