Slide 1

Slide 1 text

THE SAFETY OF UNSAFE SWIFT @RAYFIX ⚡ try! Swift Japan 2017 1

Slide 2

Slide 2 text

UB UNDEFINED BEHAVIOR 2

Slide 3

Slide 3 text

UNDEFINED SCHEDULE = 3

Slide 4

Slide 4 text

SWIFT SAFETY 4

Slide 5

Slide 5 text

WORKING WITH C PERFORMANCE LOW LEVEL 5

Slide 6

Slide 6 text

SWIFT POINTERS UnsafeMutableRawBufferPointer Mutable Raw Buffer 6

Slide 7

Slide 7 text

7

Slide 8

Slide 8 text

O(1) CONSTANT TIME LOOKUP DICTIONARIES AND SETS8

Slide 9

Slide 9 text

O(N) LINEAR TIME LOOKUP BAD HASH O(1) 9

Slide 10

Slide 10 text

struct Angle: Hashable { var radians: Double … var hashValue: Int { return radians.hashValue } } ANGLE 10

Slide 11

Slide 11 text

struct Point: Hashable { var x, y: Double var hashValue: Int { return x.hashValue ^ y.hashValue } } ^ COMPOSITION 11

Slide 12

Slide 12 text

struct Point: Hashable { var x, y: Double var hashValue: Int { return "\(x),\(y)".hashValue } } FAKE IT Heap Allocations are Expensive! 12

Slide 13

Slide 13 text

protocol HashAlgorithm { init() // 1 mutating func consume(bytes:) // 2 var finalValue: Int // 3 } ROBUST COMPOSITION13

Slide 14

Slide 14 text

struct FVN1AHash: HashAlgorithm { private var hash: UInt64 = 0xcbf29ce484222325 private let prime: UInt64 = 0x100000001b3 mutating func consume(bytes: S) where S.Iterator.Element == UInt8 { for byte in bytes { hash = (hash ^ UInt64(byte)) &* prime } } var finalValue: Int { return Int(truncatingBitPattern: hash) } } HASH ALGO AUTHORS14

Slide 15

Slide 15 text

var hashValue: Int { var hash = FVN1AHash() hash.consume(x) hash.consume(y) return hash.finalValue } SAFE EASY CLIENT CODE15

Slide 16

Slide 16 text

UNSAFE CODE SAFELY HIDDEN AWAY extension HashAlgorithm { mutating func consume(_ value: I) { var temp = value withUnsafeBytes(of: &temp) { rawBufferPointer in consume(bytes: rawBufferPointer) } } } 16

Slide 17

Slide 17 text

Safe, Swifty API for Users Safe Customization Points for Library Developers Well Tested Unsafe Code UNSAFE CODE SAFELY HIDDEN AWAY 17

Slide 18

Slide 18 text

18