在Swift中将整数转换为罗马数字字符串

在Swift中将整数转换为罗马数字字符串,swift,nsnumber,swift-extensions,Swift,Nsnumber,Swift Extensions,我希望在Swift中获取一个整数,并将其转换为罗马数字字符串。有什么想法吗?可以在Int上编写一个扩展,类似于下面看到的扩展 请注意:对于小于1的数字,此代码将返回“”。虽然这对于罗马数字(零不存在)来说可能没问题,但您可能希望在自己的实现中以不同的方式处理这个问题 extension Int { var romanNumeral: String { var integerValue = self var numeralString = ""

我希望在Swift中获取一个
整数
,并将其转换为罗马数字
字符串
。有什么想法吗?

可以在
Int
上编写一个扩展,类似于下面看到的扩展

请注意:对于小于1的数字,此代码将返回“”。虽然这对于罗马数字(零不存在)来说可能没问题,但您可能希望在自己的实现中以不同的方式处理这个问题

extension Int {
    var romanNumeral: String {
        var integerValue = self
        var numeralString = ""
        let mappingList: [(Int, String)] = [(1000, "M"), (900, "CM"), (500, "D"), (400, "CD"), (100, "C"), (90, "XC"), (50, "L"), (40, "XL"), (10, "X"), (9, "IX"), (5, "V"), (4, "IV"), (1, "I")]
        for i in mappingList {
            while (integerValue >= i.0) {
                integerValue -= i.0
                numeralString += i.1
            }
        }
        return numeralString
    }
}

感谢Kenneth Bruno对改进代码的一些建议。

这是我的int-to-roman转换器版本(没有嵌套循环):


我可以得到一些关于为什么这个问题被否决的评论吗?你可以通过在mappingList中将第6行和第7行更改为
来简化代码,其中(integerValue>=I.0){
和所有
mappingList[I]
i
。我还想把它作为一个计算属性,这很适合。对我来说似乎是一个好算法!谢谢你的建议,@KennethBruno。我更新了代码以使用修改后的for循环声明。另外,我是swift新手,所以当我有机会进一步查看映射列表的计算属性时。到将第2行的计算属性更改为
var RomanNumeric:String{ <代码> >。你可以称之为代码>数字。浪漫数字< /代码>,就像一个常规属性。哦,去掉第7行和第10行,你不再需要它们了。好,很好知道,谢谢。我当然会考虑。但是我认为while循环仍然是必要的,因为你可以有同一个字母的多个实例。例如,3 =“III”。是的,你说得对,它一定在里面。我完全错过了!
extension Int {
    func toRoman() -> String {
        let conversionTable: [(intNumber: Int, romanNumber: String)] =
            [(1000, "M"),
             (900, "CM"),
             (500, "D"),
             (400, "CD"),
             (100, "C"),
             (90, "XC"),
             (50, "L"),
             (40, "XL"),
             (10, "X"),
             (9, "IX"),
             (5, "V"),
             (4, "IV"),
             (1, "I")]
        var roman = ""
        var remainder = 0
        
        for entry in conversionTable {
            let quotient = (self - remainder) / entry.intNumber
            remainder += quotient * entry.intNumber
            roman += String(repeating: entry.romanNumber, count: quotient)
        }
        
        return roman
    }
}