首先你需要一個CustomDoubleConvertible
協議。這反映了CustomStringConvertible
。您將所有可以轉換爲Double
的類型擴展。類似於description
,它返回Type的String
表示。
protocol CustomDoubleConvertible {
var doubleValue : Double { get }
}
extension Int : CustomDoubleConvertible {
var doubleValue : Double { return Double(self) }
}
extension Int16 : CustomDoubleConvertible {
var doubleValue : Double { return Double(self) }
}
如果使功能的擴展,Range
本身,你可以利用它的一般本性和它的typealiases
。
extension Range where Element.Distance : CustomDoubleConvertible {
現在你可以計算指標的補償,像這樣:
let startOffset = Int(portion * self.count.doubleValue)
let endOffset = Int(portion * self.count.doubleValue)
如果進一步限制Range
,以便它Element
必須是一個BidirectionalIndexType
可以使用successor
和predecessor
。
extension Range where Element.Distance : CustomDoubleConvertible, Element : BidirectionalIndexType {
這可以讓你通過循環偏移,並呼籲successor
和predecessor
得到完整的功能。
extension Range where Element.Distance : CustomDoubleConvertible, Element : BidirectionalIndexType {
func truncateTailsOfRange(portion: Double) -> Range<Element> {
let startOffset = Int(portion * self.count.doubleValue)
let endOffset = Int(portion * self.count.doubleValue)
var start = self.startIndex
var end = self.endIndex
for _ in 0..<startOffset { start = start.successor() }
for _ in 0..<endOffset { end = end.predecessor() }
return Range(start: start, end: end)
}
}
一些測試:
let rangeA = 1...4 // 1..<5
let rangeB = "a"..."g"
rangeA.truncateTailsOfRange(0.3) // 2..<4
rangeB.truncateTailsOfRange(0.3) // has no member ....
let w : Int16 = 3
let z : Int16 = 9
let rangeC = w...z // 3..<10
rangeC.truncateTailsOfRange(0.4) // 5..<8
你需要一個範圍內的所有整數類型?爲每一個你需要的方法創建一個方法會容易得多。 –
我只需要Int,但動機很簡單,沒有理由將其限制爲整數 –
您試圖調用T上的構造函數,但T不是實際的類/結構體/枚舉,而只是一個「類型「。 – davecom