Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add New Extension MeasurementExtensions #936

Merged
5 changes: 3 additions & 2 deletions CHANGELOG.md
Expand Up @@ -56,21 +56,22 @@ The changelog for **SwifterSwift**. Also see the [releases](https://github.com/S
- Added `widthConstraint`, `heightConstraint`, `leadingConstraint`, `trailingConstraint`, `topConstraint`, and `bottomConstraint` for finding specific constraints. [#886](https://github.com/SwifterSwift/SwifterSwift/pull/886) by [gurgeous]
- **StringProtocol**
- Added `replacingOccurrences(ofPattern:withTemplate:options:searchRange:)` as a more convenient way to replace patterns. [#901](https://github.com/SwifterSwift/SwifterSwift/pull/901) by [gurgeous](https://github.com/gurgeous)
- **Measurement**
- Added `.degrees(_:)`, `arcMinutes(_:)`, `arcSeconds(_:)`, `radians(_:)`, `gradians(_:)` and `revolutions(_:)` to conveniently initialize measurement with corresponding unit. [#936](https://github.com/SwifterSwift/SwifterSwift/pull/936) by [Shiva Huang](https://github.com/ShivaHuang)

### Changed
- **NSAttributedString**:
- `bolded` maintains font size and works on all platforms except Linux. `italicized` maintains font size and works on all platforms except Linux and macOS. [#900](https://github.com/SwifterSwift/SwifterSwift/pull/900) by [guykogus](https://github.com/guykogus)
- `applying(attributes:)` changed access modifier from `fileprivate` to `public`. [#832](https://github.com/SwifterSwift/SwifterSwift/pull/832) by [cHaLkdusT](https://github.com/cHaLkdusT)
- **Color**:
- Refactored `init(light:dark:)` to remove deployment target version restrictions. [#844](https://github.com/SwifterSwift/SwifterSwift/pull/844) by [VincentSit](https://github.com/vincentsit).
- Use `enum` to declare namespace instead of using `struct`. Thus private initailizer is no longer needed. [#927](https://github.com/SwifterSwift/SwifterSwift/pull/927) by [Shiva Huang](https://github.com/ShivaHuang)
- **CAGradientLayer**:
- In `init(colors:locations:startPoint:endPoint:type:)` added default values to `startPoint` and `endPoint`. [#864](https://github.com/SwifterSwift/SwifterSwift/pull/864) by [guykogus](https://github.com/guykogus)
- **UITextField**:
- Added `addPaddingRight`,`addPaddingRightIcon`extension,[#878](https://github.com/SwifterSwift/SwifterSwift/pull/878) by [Jayxiang](https://github.com/Jayxiang)
- **UIAlertController**:
- Mark `show` method as unavailable for `iOSAppExtension` targets. [#918](https://github.com/SwifterSwift/SwifterSwift/pull/918) by [LucianoPAlmeida](https://github.com/LucianoPAlmeida)
- **ColorExtension**:
- Use `enum` to declare namespace instead of using `struct`. Thus private initailizer is no longer needed. [#927] by [Shiva Huang](https://github.com/ShivaHuang)

### Deprecated
- **Sequence**:
Expand Down
52 changes: 52 additions & 0 deletions Sources/SwifterSwift/Foundation/MeasurementExtensions.swift
@@ -0,0 +1,52 @@
// MeasurementExtensions.swift - Copyright 2021 SwifterSwift

#if canImport(Foundation)
import Foundation

// MARK: - Methods
@available(OSX 10.12, tvOS 10.0, watchOS 3.0, *)
public extension Measurement where UnitType == UnitAngle {
/// SwifterSwift: Create a Measurement for an angle with a specified value in degrees.
ShivaHuang marked this conversation as resolved.
Show resolved Hide resolved
/// - Parameter value: The quantity of the angle in degree.
/// - Returns: Measurement for an angle with unit degrees.
static func degrees(_ value: Double) -> Measurement {
Measurement(value: value, unit: .degrees)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we discussed in earlier PRs that functions won't elude return statements, only closures. WDYT @LucianoPAlmeida?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, nice catch ... I think we should use explicit return here because that would be consistent with the rest of the project :)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Modified.

BTW, is there any coding style / convention guideline for SwifterSwift?
I tried to dig repo history myself but there're always something missing. 🤔

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

BTW, is there any coding style / convention guideline for SwifterSwift?

I think we don't have a style, but normally the recommendation is just try to follow the same style as the rest of the codebase =]

}

/// SwifterSwift: Create a Measurement for an angle with a specified value in arc minutes.
/// - Parameter value: The quantity of the angle in arc minutes.
/// - Returns: Measurement for an angle with unit arc minutes.
static func arcMinutes(_ value: Double) -> Measurement {
Measurement(value: value, unit: .arcMinutes)
}

/// SwifterSwift: Create a Measurement for an angle with a specified value in arc seconds.
/// - Parameter value: The quantity of the angle in arc seconds.
/// - Returns: Measurement for an angle with unit arc seconds.
static func arcSeconds(_ value: Double) -> Measurement {
Measurement(value: value, unit: .arcSeconds)
}

/// SwifterSwift: Create a Measurement for an angle with a specified value in radians.
/// - Parameter value: The quantity of the angle in radians.
/// - Returns: Measurement for an angle with unit radians.
static func radians(_ value: Double) -> Measurement {
Measurement(value: value, unit: .radians)
}

/// SwifterSwift: Create a Measurement for an angle with a specified value in gradians.
/// - Parameter value: The quantity of the angle in gradians.
/// - Returns: Measurement for an angle with unit gradians.
static func gradians(_ value: Double) -> Measurement {
Measurement(value: value, unit: .gradians)
}

/// SwifterSwift: Create a Measurement for an angle with a specified value in revolutions.
/// - Parameter value: The quantity of the angle in revolutions.
/// - Returns: Measurement for an angle with unit revolutions.
static func revolutions(_ value: Double) -> Measurement {
Measurement(value: value, unit: .revolutions)
}
}

#endif
18 changes: 18 additions & 0 deletions SwifterSwift.xcodeproj/project.pbxproj
Expand Up @@ -358,6 +358,10 @@
278CA0911F9A9679004918BD /* NSImageExtensionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 278CA0901F9A9679004918BD /* NSImageExtensionsTests.swift */; };
42F53FEC2039C5AC0070DC11 /* UIStackViewExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42F53FEB2039C5AC0070DC11 /* UIStackViewExtensions.swift */; };
42F53FF02039C7140070DC11 /* UIStackViewExtensionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42F53FEF2039C7140070DC11 /* UIStackViewExtensionsTests.swift */; };
58253512259CF23B00407B78 /* MeasurementExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58253511259CF23B00407B78 /* MeasurementExtensions.swift */; };
58253513259CF23B00407B78 /* MeasurementExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58253511259CF23B00407B78 /* MeasurementExtensions.swift */; };
58253514259CF23B00407B78 /* MeasurementExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58253511259CF23B00407B78 /* MeasurementExtensions.swift */; };
58253515259CF23B00407B78 /* MeasurementExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58253511259CF23B00407B78 /* MeasurementExtensions.swift */; };
5C88FBEC234CC1280065A942 /* NSColorExtensionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C88FBEB234CC1280065A942 /* NSColorExtensionsTests.swift */; };
664CB96D2171863B00FC87B4 /* BidirectionalCollectionExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 664CB96C2171863B00FC87B4 /* BidirectionalCollectionExtensions.swift */; };
664CB96E2171863B00FC87B4 /* BidirectionalCollectionExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 664CB96C2171863B00FC87B4 /* BidirectionalCollectionExtensions.swift */; };
Expand Down Expand Up @@ -523,6 +527,9 @@
9DC844A32349E1EE00E1571A /* UIColorExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9DC844A22349E1EE00E1571A /* UIColorExtensions.swift */; };
9DC844A62349E27600E1571A /* NSColorExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9DC844A42349E24600E1571A /* NSColorExtensions.swift */; };
9DC844A82349E28100E1571A /* UIColorExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9DC844A22349E1EE00E1571A /* UIColorExtensions.swift */; };
9E28344D25AEBD160093203B /* MeasurementExtensionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E28344C25AEBD160093203B /* MeasurementExtensionsTests.swift */; };
9E28344E25AEBD160093203B /* MeasurementExtensionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E28344C25AEBD160093203B /* MeasurementExtensionsTests.swift */; };
9E28344F25AEBD160093203B /* MeasurementExtensionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E28344C25AEBD160093203B /* MeasurementExtensionsTests.swift */; };
A94AA78720280F9100E229A5 /* FileManagerExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = A94AA78620280F9100E229A5 /* FileManagerExtensions.swift */; };
A94AA78A202819B400E229A5 /* FileManagerExtensionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A94AA7882028193A00E229A5 /* FileManagerExtensionsTests.swift */; };
A94AA78B202819B400E229A5 /* FileManagerExtensionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A94AA7882028193A00E229A5 /* FileManagerExtensionsTests.swift */; };
Expand Down Expand Up @@ -790,6 +797,7 @@
278CA0901F9A9679004918BD /* NSImageExtensionsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSImageExtensionsTests.swift; sourceTree = "<group>"; };
42F53FEB2039C5AC0070DC11 /* UIStackViewExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIStackViewExtensions.swift; sourceTree = "<group>"; };
42F53FEF2039C7140070DC11 /* UIStackViewExtensionsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIStackViewExtensionsTests.swift; sourceTree = "<group>"; };
58253511259CF23B00407B78 /* MeasurementExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MeasurementExtensions.swift; sourceTree = "<group>"; };
5C88FBEB234CC1280065A942 /* NSColorExtensionsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSColorExtensionsTests.swift; sourceTree = "<group>"; };
5E36CB6424AC9909007727DA /* MyViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyViewController.swift; sourceTree = "<group>"; };
664CB96C2171863B00FC87B4 /* BidirectionalCollectionExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BidirectionalCollectionExtensions.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -850,6 +858,7 @@
9DC29CF32349E7E200F5CAAD /* UIColorExtensionsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIColorExtensionsTests.swift; sourceTree = "<group>"; };
9DC844A22349E1EE00E1571A /* UIColorExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIColorExtensions.swift; sourceTree = "<group>"; };
9DC844A42349E24600E1571A /* NSColorExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSColorExtensions.swift; sourceTree = "<group>"; };
9E28344C25AEBD160093203B /* MeasurementExtensionsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MeasurementExtensionsTests.swift; sourceTree = "<group>"; };
A94AA78620280F9100E229A5 /* FileManagerExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileManagerExtensions.swift; sourceTree = "<group>"; };
A94AA7882028193A00E229A5 /* FileManagerExtensionsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileManagerExtensionsTests.swift; sourceTree = "<group>"; };
B22EB2B620E9E720001EAE70 /* RangeReplaceableCollectionExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RangeReplaceableCollectionExtensions.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -1090,6 +1099,7 @@
07B7F16B1F5EB41600E6F910 /* DateExtensions.swift */,
A94AA78620280F9100E229A5 /* FileManagerExtensions.swift */,
07B7F1731F5EB41600E6F910 /* LocaleExtensions.swift */,
58253511259CF23B00407B78 /* MeasurementExtensions.swift */,
F87AA5D4241257E3005F5B28 /* NotificationCenterExtensions.swift */,
07B7F1621F5EB41600E6F910 /* NSAttributedStringExtensions.swift */,
9D4914821F85138E00F3868F /* NSPredicateExtensions.swift */,
Expand Down Expand Up @@ -1175,6 +1185,7 @@
07C50CFF1F5EB03200F46E5A /* DateExtensionsTests.swift */,
A94AA7882028193A00E229A5 /* FileManagerExtensionsTests.swift */,
07C50D041F5EB03200F46E5A /* LocaleExtensionsTests.swift */,
9E28344C25AEBD160093203B /* MeasurementExtensionsTests.swift */,
F87AA5D924125C19005F5B28 /* NotificationCenterExtensionsTests.swift */,
07C50D291F5EB03200F46E5A /* NSAttributedStringExtensionsTests.swift */,
9D4914881F8515D100F3868F /* NSPredicateExtensionsTests.swift */,
Expand Down Expand Up @@ -1957,6 +1968,7 @@
9D9784DB1FCAE3D200D988E7 /* StringProtocolExtensions.swift in Sources */,
F8A710E923BF3EF100112DAD /* EdgeInsetsExtensions.swift in Sources */,
07B7F20C1F5EB43C00E6F910 /* BoolExtensions.swift in Sources */,
58253512259CF23B00407B78 /* MeasurementExtensions.swift in Sources */,
07B7F22F1F5EB45100E6F910 /* CGFloatExtensions.swift in Sources */,
9D806A602258D503008E500A /* SCNPlaneExtensions.swift in Sources */,
CF30948A216AAC7A005609BC /* UIActivityExtensions.swift in Sources */,
Expand Down Expand Up @@ -2067,6 +2079,7 @@
9D806A6B2258DC3E008E500A /* SCNShapeExtensions.swift in Sources */,
07B7F2381F5EB45200E6F910 /* CLLocationExtensions.swift in Sources */,
07B7F1FC1F5EB43C00E6F910 /* CollectionExtensions.swift in Sources */,
58253513259CF23B00407B78 /* MeasurementExtensions.swift in Sources */,
74932D1623B8CEB800A56D81 /* SKProductExtensions.swift in Sources */,
F854D2B62423E1F0003A08A9 /* CAGradientLayerExtensions.swift in Sources */,
07B7F2031F5EB43C00E6F910 /* IntExtensions.swift in Sources */,
Expand Down Expand Up @@ -2191,6 +2204,7 @@
07B7F1C01F5EB42200E6F910 /* UIButtonExtensions.swift in Sources */,
07B7F1F71F5EB43B00E6F910 /* URLExtensions.swift in Sources */,
07B7F1C71F5EB42200E6F910 /* UINavigationControllerExtensions.swift in Sources */,
58253514259CF23B00407B78 /* MeasurementExtensions.swift in Sources */,
07B7F1CB1F5EB42200E6F910 /* UISliderExtensions.swift in Sources */,
B2A0DAB82336D5A6002B0BC5 /* StdlibDeprecated.swift in Sources */,
07B7F1BF1F5EB42200E6F910 /* UIBarButtonItemExtensions.swift in Sources */,
Expand Down Expand Up @@ -2303,6 +2317,7 @@
116090B224187D5C00DDCD01 /* CGRectExtensions.swift in Sources */,
9D4914861F85138E00F3868F /* NSPredicateExtensions.swift in Sources */,
07B7F2271F5EB44600E6F910 /* NSViewExtensions.swift in Sources */,
58253515259CF23B00407B78 /* MeasurementExtensions.swift in Sources */,
C7E027C72360942000F1061E /* KeyedDecodingContainerExtensions.swift in Sources */,
07B7F2211F5EB44600E6F910 /* CGFloatExtensions.swift in Sources */,
);
Expand All @@ -2329,6 +2344,7 @@
664CB98A21724A9100FC87B4 /* DispatchQueueExtensionsTests.swift in Sources */,
664CB97B21718B1D00FC87B4 /* BinaryFloatingPointExtensionsTests.swift in Sources */,
07C50D3C1F5EB04700F46E5A /* UITableViewExtensionsTests.swift in Sources */,
9E28344D25AEBD160093203B /* MeasurementExtensionsTests.swift in Sources */,
F87AA5DA24125C19005F5B28 /* NotificationCenterExtensionsTests.swift in Sources */,
985C1B932479795B008AAB0E /* WKWebViewExtensionsTests.swift in Sources */,
078916DE20760DA700AC0665 /* SignedIntegerExtensionsTests.swift in Sources */,
Expand Down Expand Up @@ -2451,6 +2467,7 @@
9D49148A1F8515D100F3868F /* NSPredicateExtensionsTests.swift in Sources */,
07C50D651F5EB05100F46E5A /* ArrayExtensionsTests.swift in Sources */,
F8885CF324D2ECB3009C33C0 /* WKWebViewExtensionsTests.swift in Sources */,
9E28344E25AEBD160093203B /* MeasurementExtensionsTests.swift in Sources */,
748B192023B4F4FA0030FABB /* SKProductTests.swift in Sources */,
2141A353235F37C100218109 /* TestHelpers.swift in Sources */,
07C50D6D1F5EB05100F46E5A /* FloatExtensionsTests.swift in Sources */,
Expand Down Expand Up @@ -2538,6 +2555,7 @@
F87AA5DC24125C19005F5B28 /* NotificationCenterExtensionsTests.swift in Sources */,
07C50D861F5EB05800F46E5A /* NSViewExtensionsTests.swift in Sources */,
F854D2B92423E1FE003A08A9 /* CAGradientLayerExtensionsTests.swift in Sources */,
9E28344F25AEBD160093203B /* MeasurementExtensionsTests.swift in Sources */,
07C50D851F5EB05800F46E5A /* NSAttributedStringExtensionsTests.swift in Sources */,
07C50D7C1F5EB05100F46E5A /* IntExtensionsTests.swift in Sources */,
F8C1AE76225B871F0045D5A0 /* NSRegularExpressionExtensionsTests.swift in Sources */,
Expand Down
50 changes: 50 additions & 0 deletions Tests/FoundationTests/MeasurementExtensionsTests.swift
@@ -0,0 +1,50 @@
// MeasurementExtensionsTests.swift - Copyright 2021 SwifterSwift

@testable import SwifterSwift
import XCTest

#if canImport(Foundation)
import Foundation

@available(OSX 10.12, tvOS 10.0, watchOS 3.0, *)
class MeasurementExtensionsTests: XCTestCase {
private let angleValue = 2.28

func testDegrees() {
let angle = Measurement.degrees(angleValue)
XCTAssertEqual(angle.unit, UnitAngle.degrees)
XCTAssertEqual(angle.value, angleValue)
}

func testArcMinutes() {
let angle = Measurement.arcMinutes(angleValue)
XCTAssertEqual(angle.unit, UnitAngle.arcMinutes)
XCTAssertEqual(angle.value, angleValue)
}

func testArcSeconds() {
let angle = Measurement.arcSeconds(angleValue)
XCTAssertEqual(angle.unit, UnitAngle.arcSeconds)
XCTAssertEqual(angle.value, angleValue)
}

func testRadians() {
let angle = Measurement.radians(angleValue)
XCTAssertEqual(angle.unit, UnitAngle.radians)
XCTAssertEqual(angle.value, angleValue)
}

func testGradians() {
let angle = Measurement.gradians(angleValue)
XCTAssertEqual(angle.unit, UnitAngle.gradians)
XCTAssertEqual(angle.value, angleValue)
}

func testRevolutions() {
let angle = Measurement.revolutions(angleValue)
XCTAssertEqual(angle.unit, UnitAngle.revolutions)
XCTAssertEqual(angle.value, angleValue)
}
}

#endif