Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/118.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在Swift中连接类似Int的字符串?_Ios_Swift4.1 - Fatal编程技术网

Ios 在Swift中连接类似Int的字符串?

Ios 在Swift中连接类似Int的字符串?,ios,swift4.1,Ios,Swift4.1,我需要像这样的东西 var a = 1 var b = 2 var c = a + b should be 12 (Int) instead of 3. var a = 12 var b = 34 var c = a + b should be 1234 (Int) instead of 46. 我不知道我们怎么能为任何数字这样做 一种方法是将两个都是Int的字符串转换成String,连接并再次将它转换成Int,但我认为这不是很有效 如果您有解决方案,请提前感谢。您可以这样写: extens

我需要像这样的东西

var a = 1
var b = 2
var c = a + b should be 12 (Int) instead of 3.

var a = 12
var b = 34
var c = a + b should be 1234 (Int) instead of 46.
我不知道我们怎么能为任何数字这样做

一种方法是将两个都是Int的字符串转换成String,连接并再次将它转换成Int,但我认为这不是很有效


如果您有解决方案,请提前感谢。

您可以这样写:

extension Int {
    func concatenateDecimalDigits(in other: Int) -> Int {
        let scale: Int
        switch other {
        case 0...9:
            scale = 10
        case 10...99:
            scale = 100
        case 100...999:
            scale = 1000
        case 1000...9999:
            scale = 10000
        case 10000...99999:
            scale = 100000
        case 100000...999999:
            scale = 1000000
        //You need to add more cases if you need...
        //...
            //...
        default:
            scale = 0   //ignore invalid values
        }
        return self * scale + other
    }
}
var a = 1
var b = 2
print( a.concatenateDecimalDigits(in: b) ) //->12
a = 12
b = 34
print( a.concatenateDecimalDigits(in: b) ) //->1234
a = 122344
b = 9022
print( a.concatenateDecimalDigits(in: b) ) //->1223449022

您可以编写一些逻辑来计算
比例
,而不使用
开关
,但这没有多大区别。

12+34=12*10^2+34=1200+34=1234

func logC(val: Double, forBase base: Double) -> Double {
    return log(val)/log(base)
}

var a = 10
var b = 0
let x = b == 10 ? 2 : b == 0 ? 1 : ceil(logC(val: Double(b), forBase: 10))
var c = Int(Double(a) * pow(10, x) + Double(b))
print(c)

任意两个
Int的通用解决方案

您需要计算乘法器的位数,如下所示:

func numberOfDigits(_ num: Int) -> Int {
    var count = 0
    var number = num
    while number > 0 {
        number = number / 10
        count += 1
    }
    return count
}
将其用作:

    let a = 11
    let b = 24

    let noOfDigit = numberOfDigits(b)
    let multiplier = pow(Double(10), Double(noOfDigit))
    let c = a * Int(multiplier) + b
    print(c)
在一行中,如下所示:

    let c = a * Int(pow(Double(10), Double(numberOfDigits(b)))) + b

您可以通过如下所示的简单转换完成此操作:

var a = 1
var b = 2
var c = Int("\(a)\(b)") // Result 12

var a1 = 12
var b1 = 34
var c1 = Int("\(a1)\(b1)")  // Result 1234


var a2 = 122344
var b2 = 9022
var c2 = Int("\(a2)\(b2)") // Result 1223449022

var c=a*10+b
resp
var c=a*100+b
,您只需检查a与10、100相乘的“大”程度,依此类推。@AndreasOetjen我知道,但这不是一个正确的解决方案,var a=122344和b=9022,这个呢?每次都需要编写不同的代码。您可以使用第10个对数找出“b”的维数(例如分数之前的部分),然后计算10的幂,并将其乘以
a
。或者,更有效的方法是使用switch-case语句。是否有人检查过这些解决方案是否比将int转换为string和back更有效?也许把这个也加在答案上?我查过了。我的解决方案(在操场上)比字符串连接快3倍。这很好,但我认为它没有那么高的性能,因为
log
function@AndreasOetjen这是真的,它没有性能,当我没有找到任何快速功能时,我很惊讶,你认为它应该在Swift 5中吗?你可以将第二个数字转换成字符串,然后得到它的长度。或者直接除以10,直到得到零。它不起作用,尝试使用
a=10
b=10
,得到的是
110
,而不是
1010
。您必须将
x
增加一个:
让x=ceil(logC(val:Double(b),forBase:10))+1
而且,如果
b=0
,它也不起作用;在这种情况下,您将得到
x=-inf
我认为这是最有效/性能最好的解决方案,而无需任何
log
计算。但是它并不像往常那样好看:-)顺便说一下,这可以简化为类似于
let scales=[1,10100100010000,…];设scale=(scales.first{other<$0})??0
@Sulthan,是的,这是一个可能的选项,我已经在一些逻辑中包括了它来计算
比例
,而不使用
开关
。事实上,我选择我的代码是为了易于理解的可读性,而不是为了性能或代码简洁性。这不是答案,这是@Jigar已经提出的问题:一种方法是将两个Int转换为String,串联并再次将该字符串转换为Int,但我认为这不是有效的。