<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><br class=""><div><br class=""><blockquote type="cite" class=""><div class="">On 14. Jan 2018, at 06:04, BJ Homer via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html; charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">An Angle type already exists in Foundation; see Measurement&lt;UnitAngle&gt;. You could add some convenience methods in an extension pretty easily.<div class=""><br class=""></div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><div class=""><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""><span style="color: #ba2da2" class="">import</span> Foundation</div></div><div class=""><div style="margin: 0px; font-stretch: normal; font-size: 12px; line-height: normal; background-color: rgb(255, 255, 255); min-height: 14px;" class=""><br class=""></div></div><div class=""><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(112, 61, 170); background-color: rgb(255, 255, 255);" class=""><span style="color: #ba2da2" class="">typealias</span><span style="" class=""> Angle = </span>Measurement<span style="" class="">&lt;</span>UnitAngle<span style="" class="">&gt;</span></div></div><div class=""><div style="margin: 0px; font-stretch: normal; font-size: 12px; line-height: normal; background-color: rgb(255, 255, 255); min-height: 14px;" class=""><br class=""></div></div><div class=""><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""><span style="color: #ba2da2" class="">extension</span> <span style="color: #703daa" class="">Measurement</span> <span style="color: #ba2da2" class="">where</span> UnitType == UnitAngle {</div></div><div class=""><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class="">&nbsp; &nbsp; <span style="color: #ba2da2" class="">var</span> sine: <span style="color: #703daa" class="">Double</span> {</div></div><div class=""><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class="">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ba2da2" class="">let</span> radians = <span style="color: #ba2da2" class="">self</span>.<span style="color: #3e1e81" class="">converted</span>(to: .<span style="color: #703daa" class="">radians</span>).<span style="color: #703daa" class="">value</span></div></div><div class=""><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class="">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ba2da2" class="">return</span> <span style="color: #3e1e81" class="">sin</span>(radians)</div></div><div class=""><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class="">&nbsp; &nbsp; }</div></div><div class=""><p style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255); min-height: 13px;" class="">&nbsp;&nbsp; &nbsp;<br class="webkit-block-placeholder"></p></div><div class=""><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class="">&nbsp; &nbsp; <span style="color: #ba2da2" class="">static</span> <span style="color: #ba2da2" class="">var</span> threeQuarterTurn: <span style="color: #4f8187" class="">Angle</span> {</div></div><div class=""><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class="">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ba2da2" class="">return</span> <span style="color: #4f8187" class="">Angle</span>(value: <span style="color: #272ad8" class="">0.75</span>, unit: .<span style="color: #703daa" class="">revolutions</span>)</div></div><div class=""><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class="">&nbsp; &nbsp; }</div></div><div class=""><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class="">}</div></div><div class=""><div style="margin: 0px; font-stretch: normal; font-size: 12px; line-height: normal; background-color: rgb(255, 255, 255); min-height: 14px;" class=""><br class=""></div></div><div class=""><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(79, 129, 135); background-color: rgb(255, 255, 255);" class=""><span style="color: #ba2da2" class="">let</span><span style="" class=""> x = </span>Angle<span style="" class="">.</span>threeQuarterTurn</div></div><div class=""><div style="margin: 0px; font-stretch: normal; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(79, 129, 135); background-color: rgb(255, 255, 255);" class="">x<span style="" class="">.</span>sine<span style="" class=""> </span><span style="color: #008400" class="">// -1</span></div></div></blockquote><div class=""><div class=""><br class=""></div><div class="">-BJ</div></div></div></div></blockquote><div><br class=""></div><div>Maybe it would be good to pitch such improvements to the Foundation API?&nbsp;“Angle” is certainly a lot more discoverable and convenient to type than “Measurement&lt;UnitAngle&gt;”. That said, I tend not to use Foundation’s Measurement API. It’s pretty heavyweight.</div><div><br class=""></div><div>test.swift:</div><div><br class=""></div></div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><div><div><div><font face="Courier" class="">import Foundation</font></div></div></div><div><div><div><font face="Courier" class=""><br class=""></font></div></div></div><div><div><div><font face="Courier" class="">@available(macOS 10.12, *)</font></div></div></div><div><div><div><font face="Courier" class="">func a() {</font></div></div></div><div><div><div><font face="Courier" class="">&nbsp; &nbsp; let a = Measurement(value: 20, unit: UnitDuration.minutes).converted(to: .seconds)</font></div></div></div><div><div><div><font face="Courier" class="">&nbsp;}</font></div></div></div></blockquote><div><div><div><br class=""></div><div>Generated IR:</div><div><br class=""></div></div></div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><div><div><div><div><font face="Courier" class="">define hidden swiftcc void @_T04test1ayyF() #0 {</font></div></div></div></div><div><div><div><div><font face="Courier" class="">entry:</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %0 = call %swift.type* @_T0So12UnitDurationCMa() #3</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %1 = getelementptr inbounds %swift.type, %swift.type* %0, i32 0, i32 0</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %.kind = load i64, i64* %1, align 8</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %isObjCClassWrapper = icmp eq i64 %.kind, 14</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; br i1 %isObjCClassWrapper, label %isWrapper, label %metadataForClass.cont</font></div></div></div></div><div><div><div><div><font face="Courier" class=""><br class=""></font></div></div></div></div><div><div><div><div><font face="Courier" class="">isWrapper: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;; preds = %entry</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %2 = bitcast %swift.type* %0 to %swift.type**</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %3 = getelementptr inbounds %swift.type*, %swift.type** %2, i64 1</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %4 = load %swift.type*, %swift.type** %3, align 8, !invariant.load !31</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; br label %metadataForClass.cont</font></div></div></div></div><div><div><div><div><font face="Courier" class=""><br class=""></font></div></div></div></div><div><div><div><div><font face="Courier" class="">metadataForClass.cont: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;; preds = %isWrapper, %entry</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %.class = phi %swift.type* [ %0, %entry ], [ %4, %isWrapper ]</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %5 = bitcast %swift.type* %.class to %objc_class*</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %6 = load i8*, i8** @"\01L_selector(minutes)", align 8</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %7 = bitcast %objc_class* %5 to i8*</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %8 = call %0* bitcast (void ()* @objc_msgSend to %0* (i8*, i8*)*)(i8* %7, i8* %6)</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %9 = bitcast %0* %8 to i8*</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %10 = call i8* @objc_retainAutoreleasedReturnValue(i8* %9) #4</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %11 = bitcast i8* %10 to %0*</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %12 = bitcast %0* %11 to %TSo12UnitDurationC*</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %.asUnsubstituted = bitcast %TSo12UnitDurationC* %12 to %TSo4UnitC*</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %13 = call swiftcc { %TSo4UnitC*, double } @_T010Foundation11MeasurementVACyxGSd5value_x4unittcfC(double 2.000000e+01, %TSo4UnitC* %.asUnsubstituted, %swift.type* %0)</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %14 = extractvalue { %TSo4UnitC*, double } %13, 0</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %15 = extractvalue { %TSo4UnitC*, double } %13, 1</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %.asSubstituted = bitcast %TSo4UnitC* %14 to %TSo12UnitDurationC*</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %16 = getelementptr inbounds %swift.type, %swift.type* %0, i32 0, i32 0</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %.kind1 = load i64, i64* %16, align 8</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %isObjCClassWrapper2 = icmp eq i64 %.kind1, 14</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; br i1 %isObjCClassWrapper2, label %isWrapper3, label %metadataForClass.cont4</font></div></div></div></div><div><div><div><div><font face="Courier" class=""><br class=""></font></div></div></div></div><div><div><div><div><font face="Courier" class="">isWrapper3: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; preds = %metadataForClass.cont</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %17 = bitcast %swift.type* %0 to %swift.type**</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %18 = getelementptr inbounds %swift.type*, %swift.type** %17, i64 1</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %19 = load %swift.type*, %swift.type** %18, align 8, !invariant.load !31</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; br label %metadataForClass.cont4</font></div></div></div></div><div><div><div><div><font face="Courier" class=""><br class=""></font></div></div></div></div><div><div><div><div><font face="Courier" class="">metadataForClass.cont4: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; preds = %isWrapper3, %metadataForClass.cont</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %.class5 = phi %swift.type* [ %0, %metadataForClass.cont ], [ %19, %isWrapper3 ]</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %20 = bitcast %swift.type* %.class5 to %objc_class*</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %21 = load i8*, i8** @"\01L_selector(seconds)", align 8</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %22 = bitcast %objc_class* %20 to i8*</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %23 = call %0* bitcast (void ()* @objc_msgSend to %0* (i8*, i8*)*)(i8* %22, i8* %21)</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %24 = bitcast %0* %23 to i8*</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %25 = call i8* @objc_retainAutoreleasedReturnValue(i8* %24) #4</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %26 = bitcast i8* %25 to %0*</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %27 = bitcast %0* %26 to %TSo12UnitDurationC*</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %.asUnsubstituted6 = bitcast %TSo12UnitDurationC* %27 to %TSo9DimensionC*</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %.asSubstituted.asUnsubstituted = bitcast %TSo12UnitDurationC* %.asSubstituted to %TSo9DimensionC*</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %28 = call swiftcc { %TSo9DimensionC*, double } @_T010Foundation11MeasurementVAASo9DimensionCRbzlE9convertedACyxGx2to_tF(%TSo9DimensionC* %.asUnsubstituted6, %TSo9DimensionC* %.asSubstituted.asUnsubstituted, double %15, %swift.type* %0)</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %29 = extractvalue { %TSo9DimensionC*, double } %28, 0</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %30 = extractvalue { %TSo9DimensionC*, double } %28, 1</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %.asSubstituted7 = bitcast %TSo9DimensionC* %29 to %TSo12UnitDurationC*</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; call void bitcast (void (%objc_object*)* @objc_release to void (%TSo12UnitDurationC*)*)(%TSo12UnitDurationC* %.asSubstituted) #4</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; call void bitcast (void (%objc_object*)* @objc_release to void (%TSo12UnitDurationC*)*)(%TSo12UnitDurationC* %.asSubstituted7) #4</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; ret void</font></div></div></div></div><div><div><div><div><font face="Courier" class="">}</font></div></div></div></div><div><div><div><div><font face="Courier" class=""><br class=""></font></div></div></div></div><div><div><div><div><font face="Courier" class="">declare swiftcc { %TSo9DimensionC*, double } @_T010Foundation11MeasurementVAASo9DimensionCRbzlE9convertedACyxGx2to_tF(%TSo9DimensionC*, %TSo9DimensionC*, double, %swift.type*) #0</font></div></div></div></div><div><div><div><div><font face="Courier" class=""><br class=""></font></div></div></div></div><div><div><div><div><font face="Courier" class="">declare swiftcc { %TSo4UnitC*, double } @_T010Foundation11MeasurementVACyxGSd5value_x4unittcfC(double, %TSo4UnitC*, %swift.type*) #0</font></div></div></div></div><div><div><div><div><font face="Courier" class=""><br class=""></font></div></div></div></div><div><div><div><div><font face="Courier" class="">; Function Attrs: nounwind readnone</font></div></div></div></div><div><div><div><div><font face="Courier" class="">define linkonce_odr hidden %swift.type* @_T0So12UnitDurationCMa() #1 {</font></div></div></div></div><div><div><div><div><font face="Courier" class="">entry:</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %0 = load %swift.type*, %swift.type** @_T0So12UnitDurationCML, align 8</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %1 = icmp eq %swift.type* %0, null</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; br i1 %1, label %cacheIsNull, label %cont</font></div></div></div></div><div><div><div><div><font face="Courier" class=""><br class=""></font></div></div></div></div><div><div><div><div><font face="Courier" class="">cacheIsNull: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;; preds = %entry</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %2 = load %objc_class*, %objc_class** @"OBJC_CLASS_REF_$_NSUnitDuration", align 8</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %3 = call %objc_class* @swift_rt_swift_getInitializedObjCClass(%objc_class* %2)</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %4 = call %swift.type* @swift_getObjCClassMetadata(%objc_class* %3) #3</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; store atomic %swift.type* %4, %swift.type** @_T0So12UnitDurationCML release, align 8</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; br label %cont</font></div></div></div></div><div><div><div><div><font face="Courier" class=""><br class=""></font></div></div></div></div><div><div><div><div><font face="Courier" class="">cont: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; preds = %cacheIsNull, %entry</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %5 = phi %swift.type* [ %0, %entry ], [ %4, %cacheIsNull ]</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; ret %swift.type* %5</font></div></div></div></div><div><div><div><div><font face="Courier" class="">}</font></div></div></div></div><div><div><div><div><font face="Courier" class=""><br class=""></font></div></div></div></div><div><div><div><div><font face="Courier" class="">; Function Attrs: noinline nounwind</font></div></div></div></div><div><div><div><div><font face="Courier" class="">define linkonce_odr hidden %objc_class* @swift_rt_swift_getInitializedObjCClass(%objc_class*) #2 {</font></div></div></div></div><div><div><div><div><font face="Courier" class="">entry:</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %load = load %objc_class* (%objc_class*)*, %objc_class* (%objc_class*)** @_swift_getInitializedObjCClass</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; %1 = tail call %objc_class* %load(%objc_class* %0)</font></div></div></div></div><div><div><div><div><font face="Courier" class="">&nbsp; ret %objc_class* %1</font></div></div></div></div><div><div><div><div><font face="Courier" class="">}</font></div></div></div></div><div><div><div><div><font face="Courier" class=""><br class=""></font></div></div></div></div><div><div><div><div><font face="Courier" class="">declare %swift.type* @swift_getObjCClassMetadata(%objc_class*)</font></div></div></div></div><div><div><div><div><font face="Courier" class=""><br class=""></font></div></div></div></div><div><div><div><div><font face="Courier" class="">declare void @objc_msgSend()</font></div></div></div></div><div><div><div><div><font face="Courier" class=""><br class=""></font></div></div></div></div><div><div><div><div><font face="Courier" class="">declare i8* @objc_retainAutoreleasedReturnValue(i8*)</font></div></div></div></div><div><div><div><div><font face="Courier" class=""><br class=""></font></div></div></div></div><div><div><div><div><font face="Courier" class="">declare void @objc_release(%objc_object*)</font></div></div></div></div></blockquote><div><div><div><div class=""><br class=""></div></div><div><br class=""></div><div><br class=""></div><div>… which, personally, I think is just excessive. Maybe for complex conversions it’s worth it, but I’m not sure it is for simple conversions.</div><div><br class=""></div><div>- Karl</div></div><br class=""><blockquote type="cite" class=""><div class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div class=""><div class=""><br class=""></div><div class=""><br class=""><blockquote type="cite" class=""><div class="">On Jan 13, 2018, at 9:31 PM, Erica Sadun via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html; charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">I would like to see a full Geometry implementation but I don't think it should be part of the standard library.<div class=""><br class=""></div><div class="">I've kicked around some ideas here:&nbsp;</div><div class=""><br class=""></div><div class="">*&nbsp;<a href="https://gist.github.com/erica/8cb4b21cf0c429828fad1d8ad459b71b" class="">https://gist.github.com/erica/8cb4b21cf0c429828fad1d8ad459b71b</a></div><div class="">*&nbsp;<a href="https://gist.github.com/erica/ee06008202c9fed699bfa6254c42c721" class="">https://gist.github.com/erica/ee06008202c9fed699bfa6254c42c721</a></div><div class=""><br class=""></div><div class="">and</div><div class=""><br class=""></div><div class="">*&nbsp;<a href="https://github.com/erica/SwiftGeometry" class="">https://github.com/erica/SwiftGeometry</a><br class=""><div class=""><br class=""><blockquote type="cite" class=""><div class="">On Jan 13, 2018, at 7:49 PM, Jonathan Hull via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Hi Evolution,<div class=""><br class=""></div><div class="">I would <i class="">really</i> like to see Swift gain an Angle type in the standard library. &nbsp;Every time I have to deal with an angle in an api, I have to go figure out the conventions for that call. &nbsp;Is it in degrees? Is it in radians? &nbsp;What if it is in radians, but I want to think about it in degrees?</div><div class=""><br class=""></div><div class="">I ended up writing an Angle type for my own code a few years back, and I have to say it is really wonderful. &nbsp;It has greatly simplified my graphics work. &nbsp;It takes a lot of mental load off of my brain when dealing with Angles.</div><div class=""><br class=""></div><div class="">I can of course initialize it either as degrees or radians (or revolutions), but I can also just say things like ‘.threeQuarterTurn’, and then I can get the value back out in whatever format I like. &nbsp;There are also useful additions that let me normalize the angle to different ranges and which let me snap to the nearest multiple of an angle. Both of these are enormously useful for user facing features. &nbsp;I can also do math on angles in a way that makes geometric sense for angles. &nbsp;It is also really useful for interacting with CGVectors in intelligent ways.</div><div class=""><br class=""></div><div class="">Using Doubles or CGFloats to represent angles everywhere is just semantically wrong IMHO, and it stops us from adding all of these angle-specific niceties.</div><div class=""><br class=""></div><div class="">Happy to provide code if there is interest…</div><div class=""><br class=""></div><div class="">Thanks,</div><div class="">Jon</div></div>_______________________________________________<br class="">swift-evolution mailing list<br class=""><a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a><br class=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class=""></div></blockquote></div><br class=""></div></div>_______________________________________________<br class="">swift-evolution mailing list<br class=""><a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a><br class=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class=""></div></blockquote></div><br class=""></div></div>_______________________________________________<br class="">swift-evolution mailing list<br class=""><a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a><br class="">https://lists.swift.org/mailman/listinfo/swift-evolution<br class=""></div></blockquote></div><br class=""></body></html>