我長期以來一直在努力為這個問題想出一個優雅的解決方案。這是一個占星術應用程式專案,我正在嘗試實施的是一個定位系統。
struct Position {
var sign: Int
var degrees: Int
var minutes: Int
}
在這個系統中,符號只能是 1…12。因此,例如,如果將 13 傳遞給符號變數,它應該從 1 重新開始。度數應該實作相同的邏輯并限制在 0…29 之間。所以傳遞給度變數的 30 應該轉換為 1。分鐘被限制在 0…59 之間。一樣的邏輯。
我正在努力實作它并讓它看起來合乎邏輯和簡約。我是否需要創建自定義型別來存盤此類值?應用程式應使用的實際格式是,例如:1 23' 45"。
編輯
如果我將 1 分鐘添加到 12 符號 29 度 59 分鐘,它應該轉換為 0 0 0。很像 Date 作業。
uj5u.com熱心網友回復:
您應該注意,符號、度數和分鐘的表示在技術上只是單個數字的人工表示。您的示例Date是一個很好的示例,因為這應該讓您意識到它Date在內部由單個表示Double,我們僅在需要時將其轉換為組件(并且轉換與日期非常復雜)。
因此,我建議的第一件事是用一個數字(實際上是總分鐘數)表示所有三個值。
那么每次計算都可以只是對這個數字的修改。
我將使用的概念很常見,它實際上與位置數字相同(例如 number 1234= ((((1 * 10) 2) * 10) 3) * 10 4)。您可能還通過從秒數計算小時和分鐘來了解這個概念。
struct Position: CustomStringConvertible {
// considering sign to be 0...11
static let signCount = 12
// degrees are 0...29
static let degreeCount = 30
// minute are 0...29
static let minuteCount = 60
// the total number of possible values, value is 0...(maxValue - 1)
static let maxValue = signCount * degreeCount * minuteCount
// if value is outside the permitted range, normalize it
private static func normalizeValue(_ value: Int) -> Int {
if value >= maxValue {
// simple modulo operation
return value % maxValue
}
if value < 0 {
// make negative values positive and within the correct range
return maxValue value % maxValue
}
return value
}
private var value: Int
init(value: Int) {
self.value = Self.normalizeValue(value)
}
init(sign: Int, degrees: Int, minutes: Int) {
// calculate position value from components
let value = ((sign * Self.degreeCount) degrees) * Self.minuteCount minutes
self.value = Self.normalizeValue(value)
}
var sign: Int {
return value / (Self.degreeCount * Self.minuteCount)
}
var degrees: Int {
return (value / Self.minuteCount) % Self.degreeCount
}
var minutes: Int {
return value % Self.minuteCount
}
func adding(_ position: Position) -> Position {
return Position(value: value position.value)
}
func adding(sign: Int, degrees: Int, minutes: Int) -> Position {
let position = Position(sign: sign, degrees: degrees, minutes: minutes)
return adding(position)
}
var description: String {
return "Sign \(sign 1), \(degrees)° \(minutes)′"
}
}
測驗:
let position = Position(sign: 23, degrees: 29, minutes: 59)
print(position) // Sign 12, 29° 59′
print(position.adding(sign: 0, degrees: 0, minutes: 2)) // Sign 1, 0° 1′
print(position.adding(sign: -13, degrees: 0, minutes: 0)) // Sign 11, 29° 59′
請注意,我 1僅在格式化時添加到符號。但是,如果您想將符號存盤為1..12代碼,則可以1在加載/存盤sign到位置值時簡單地更新代碼以添加/減去。
uj5u.com熱心網友回復:
這是一個簡單的計算屬性,可以為您完成作業。在我的例子我已經做到了在0 based index換句話說upper limit - 1。如果你想洗掉的功能,改變每一個0 to a 1和每遞增max:通過 1
class Position {
var sign: Int {
get{ return getConstrainedValue(value: self.sign, max: 12) }
set{}
}
var degrees: Int {
get{ return getConstrainedValue(value: self.degrees, max: 29) }
set{}
}
var minutes: Int {
get{ return getConstrainedValue(value: self.minutes, max: 59) }
set{}
}
func getConstrainedValue(value: Int, max limit: Int) -> Int {
// If value is greater than limit, return first value, 0.
// Otherwise, if value is less than 0, return the limit.
// Otherwise return the value.
return value > limit ? 1 : value < 1 ? limit : value
}
init(sign: Int, degrees: Int, minutes: Int) {
self.sign = sign
self.degrees = degrees
self.minutes = minutes
}
}
let test = Position(sign: 12, degrees: -1, minutes: 58)
print("sign: \(test.sign) degrees: \(test.degrees) minutes: \(test.minutes)")
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/329926.html
上一篇:我的一個python檔案具有變數x的增量編號如何匯入該變數x并在另一個python檔案上運行它,以便顯示x增加
下一篇:從函式內部呼叫多個值
