measurements and units

31
Measurements & Units WWDC16. Meetup@Wantedly 2016/06/30

Upload: ken-tominaga

Post on 12-Feb-2017

1.634 views

Category:

Technology


9 download

TRANSCRIPT

Page 1: Measurements and Units

Measurements & UnitsWWDC16. Meetup@Wantedly

2016/06/30

Page 2: Measurements and Units

About meKen Tominaga

The University of Tokyo

Rekimoto Lab

Swift Lover 😍

Page 3: Measurements and Units

Measurementsand

Units? 😳

Page 4: Measurements and Units

Nike+ Running

Page 5: Measurements and Units

Measurements and UnitsAdded to the Foundation framework

Newly introduced in iOS 10

Support for specifying Measurements and Units

Page 6: Measurements and Units

Measurementpublic struct Measurement<UnitType : Unit> : Comparable, Equatable {

public let unit: UnitType

public var value: Double

public init(value: Double, unit: UnitType) }

Page 7: Measurements and Units

Calculations With Measurements

let distanceTraveled = Measurement(value: 20, unit: UnitLength.kilometers) // 20.0 km

let distanceToGo = Measurement(value: 1.975, unit: UnitLength.kilometers) // 1.975 km

let totalDistance = distanceTraveled + distanceToGo // 21.975 km let tripleDistance = 3 * distanceToGo // 5.925 km let halfDistance = distanceToGo / 2 // 0.9875 km

Page 8: Measurements and Units

Properties of a UnitSymbol “m"

Dimension “meter is a unit of length"

Equivalence 1 m = 3.28084 ft

Page 9: Measurements and Units

Unitpublic class Unit : NSObject, NSCopying {

public var symbol: String { get } public init(symbol: String) }

Page 10: Measurements and Units

DimensionCategories of units

Expressed with different units • Length: km, m, ft, mi, etc.

Always has a base unit let meter = UnitLength.baseUnit()

Can perform conversions • km ft, m mi

Page 11: Measurements and Units

Dimensionpublic class Dimension : Unit {

@NSCopying public var converter: UnitConverter { get }

public init(symbol: String, converter: UnitConverter)

public class func baseUnit() -> Self }

Page 12: Measurements and Units

DimensionInstances as units

Singletons for most common units

International System of Units public class UnitLength : Dimension { /* Base unit - meters */ @NSCopying public class var kilometers: UnitLength { get } @NSCopying public class var meters: UnitLength { get } @NSCopying public class var feet: UnitLength { get } @NSCopying public class var yards: UnitLength { get } @NSCopying public class var miles: UnitLength { get }

... }

Page 13: Measurements and Units

Dimension

Page 14: Measurements and Units

Implicit Conversionlet distanceTraveled = Measurement(value: 2, unit: UnitLength.kilometers) // 2.0 km

//let distanceToGo = Measurement(value: 1.975, unit: UnitLength.kilometers) //let totalDistance = distanceTraveled + distanceToGo

let distanceToGo = Measurement(value: 11.3, unit: UnitLength.feet) // 11.3 ft

let totalDistance = distanceTraveled + distanceToGo // 2003.44424 m

Page 15: Measurements and Units

Next Step

Page 16: Measurements and Units

Custom Unitlet syaku = UnitLength(symbol: " ", converter: UnitConverterLinear(coefficient: 10/33))

// 1 10/30 m

Page 17: Measurements and Units

ConversionbaseUnit unit UnitConverter

• baseUnitValue(fromValue value:)

• value(fromBaseUnitValue baseUnitValue:)

UnitConverterLinear

• baseUnitValue = coefficient * value + constant

• value = (baseUnitValue - constant)/coefficient

Page 18: Measurements and Units

Custom Unitlet syaku = UnitLength(symbol: " ", converter: UnitConverterLinear(coefficient: 10/33))

// 1 10/33 m

let lengthInShayku = Measurement(value: 10, unit: syaku) // 10.0

let lengthInYards = lengthInShayku.converted(to: UnitLength.yards) // 3.31397969193245 yd

let lengthInFeet = Measurement(value: 5.3, unit: UnitLength.feet) // 5.3 ft

lengthInShayku + lengthInFeet // 4.64574303030303 m

baseUnitValue = 10/ 33 * = baseUnitValue / (10/33)

Page 19: Measurements and Units

Custom Dimensionclass UnitImpression : Dimension { static let good = UnitImpression(symbol: "👍 ", converter: UnitConverterLinear(coefficient: 1))

static let great = UnitImpression(symbol: "👏 ", converter: UnitConverterLinear(coefficient: 10))

static let wonderful = UnitImpression(symbol: "😘 ", converter: UnitConverterLinear(coefficient: 50))

static let lifeChanging = UnitImpression(symbol: "😍 ", converter: UnitConverterLinear(coefficient: 2000))

override class func baseUnit() -> UnitImpression { return good } }

Page 20: Measurements and Units

// Example - Use of Custom Dimension

struct Presentation { let speaker : String let title : String let movement : Measurement<UnitLength> let duration : Measurement<UnitDuration> let impression : Measurement<UnitImpression>

var movementRate: Measurement<UnitSpeed> { let distanceInMeters = movement.converted(to: .meters) let durationInSeconds = duration.converted(to: .seconds) return Measurement( value: distanceInMeters.value / durationInSeconds.value, unit: UnitSpeed.metersPerSecond) } }

Page 21: Measurements and Units

// Example - Use of Custom Dimension

let presentation = Presentation( speaker: "ken0nek", title: "Measurements & Units", movement: Measurement(value: 60, unit: UnitLength.centimeters), duration: Measurement(value: 10, unit: UnitDuration.minutes), impression: Measurement(value: 100, unit: UnitImpression.lifeChanging))

presentation.movementRate // 0.001 m/s

presentation.impression // 100.0 😍 presentation.impression.converted(to: UnitImpression.baseUnit()) // 200000.0 👍

Page 22: Measurements and Units

Formatting Is HardCountry Expected String

Japan “5 km"

United States “3.1 mi”

Egypt ”٥ كم“

China “5 "

Page 23: Measurements and Units

MeasurementFormatterNew formatter

Measurements and Units

Locale-aware formatting

Page 24: Measurements and Units

MeasurementFormatterpublic class MeasurementFormatter : Formatter {

public var unitOptions: MeasurementFormatter.UnitOptions

public var unitStyle: Formatter.UnitStyle

@NSCopying public var locale: Locale!

@NSCopying public var numberFormatter: NumberFormatter! public func string(from measurement: Measurement<Unit>) -> String public func string(from unit: Unit) -> String }

Page 25: Measurements and Units

Unit OptionsFormats preferred unit of locale by default

Takes purpose into account

Page 26: Measurements and Units

Unit Options

UnitOptions Measurement Locale Example String

.providedUnit value: 5, unit: .kilometers “en_US” “5 km"

.naturalScale value: 1000, unit: .meters “fr_FR” “1 km"

.temperatureWithoutUnit value: 90, unit: .fahrenheit “en_US” “90°"

Page 27: Measurements and Units

MeasurementFormatter// Current Locale -> ja_JP // This code will not work in Xcode8 beta currently :(

let formatter = MeasurementFormatter() let distance = Measurement(value: 5, unit: UnitLength.miles)

formatter.string(from: distance) // 8.04672 km

let syaku = UnitLength(symbol: " ",

converter: UnitConverterLinear(coefficient: 10/33)) let syakuDistance = Measurement(value: 660, unit: syaku)

formatter.string(from: syakuDistance) // 0.2 km

Page 28: Measurements and Units

Wrap UpSupport for handling Measurements and Units

Don’t have to care about localizing and formatting

Measurement

Unit

Dimension MeasurementFormatter

UnitConverter

Page 29: Measurements and Units

Thank you

Page 30: Measurements and Units

ReferencesMeasurements and Units - WWDC 2016 - Videos - Apple Developer

Measurement - Apple Developer Documentation

Unit - Apple Developer Documentation

Dimension - Apple Developer Documentation

UnitConverterLinear - Apple Developer Documentation

MeasurementFormatter - Apple Developer Documentation

About Internationalization and Localization

Page 31: Measurements and Units

Bug Reports

The string() method of the MeasurementFormatter... | Apple Developer Forums

Swift Compiler on iOS 10 does not properly find MeasurementFormatter.string(from:) method