最近在看个洗牌算法.想用swift 来写.
在playground环境下
func getRandomByQuJian(startIndex:Int, endIndex:Int)->Int {
let index2 = Int(arc4random_uniform(UInt32(endIndex - startIndex)) + UInt32(startIndex))
return index2
}
var nameArr = [2, 4, 45, 44]
func getRandomByArr(arrValue:[Int]){
// 遍历每个数据源
print("arrValue:\(arrValue)")
for i in 0..<arrValue.count {
var index1:Int = getRandomByQuJian(startIndex:i,endIndex:arrValue.count-1)
(arrValue[i], arrValue[index1]) = (arrValue[index1], arrValue[i])
//查看当前位置
print( i,index1)
print(nameArr)
}
}
print("值:\(getRandomByArr(arrValue:nameArr)) ")
报错:
Playground execution failed: error: MyPlayground.playground:20:41: error: cannot assign to immutable expression of type '(Int, Int)'
(arrValue[i], arrValue[index1]) = (arrValue[index1], arrValue[i])
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
swift2.0 :
func getRandomByArr(var arrValue:[Int]){
….
}
但是在3.0 已经报错了.自己查阅了好久文档,这样来处理
func getRandomByQuJian(startIndex:Int, endIndex:Int)->Int {
let index2 = Int(arc4random_uniform(UInt32(endIndex - startIndex)) + UInt32(startIndex))
return index2
}
var nameArr = [2, 4, 45, 44]
func getRandomByArr(arrValue:[Int]){
// 遍历每个数据源
print("arrValue:\(arrValue)")
var arrValue = arrValue;
for i in 0..<arrValue.count {
var index1:Int = getRandomByQuJian(startIndex:i,endIndex:arrValue.count-1)
(arrValue[i], arrValue[index1]) = (arrValue[index1], arrValue[i])
//查看当前位置
print( i,index1)
print(nameArr)
}
}
print("值:\(getRandomByArr(arrValue:nameArr)) ")
中间要加个转义的代码:
var arrValue = arrValue;
方法二: 使用地址
inout 来修饰.和swift2.0 比较inout的位置发生了变化
“Swift编程语言中引入了一种输入输出形参(in-out parameters),使得该形参的值不仅能被修改,而且还能影响它所对应的实参值。这种机制乍一看很像C语言中的指针传参,更像C++中的传引用,但是Swift中的输入输出形参机制与传统面向对象编程语言中传引用的方式有所不同。”
1、当函数在调用前,先将实参的值拷贝到所对应的输入输出形参中。
2、在执行函数中的代码时,对输入输出形参的值进行修改。
3、在函数返回之后,将修改后输入输出形参的值拷贝回对应的实参中。
func getRandomByQuJian(startIndex:Int, endIndex:Int)->Int {
let index2 = Int(arc4random_uniform(UInt32(endIndex - startIndex)) + UInt32(startIndex))
return index2
}
var nameArr = [2, 4, 45, 44]
func getRandomByArr(arrValue:inout [Int]){
// 遍历每个数据源
print("arrValue:\(arrValue)")
// var arrValue = arrValue;
for i in 0..<arrValue.count {
let index1:Int = getRandomByQuJian(startIndex:i,endIndex:arrValue.count-1)
(arrValue[i], arrValue[index1]) = (arrValue[index1], arrValue[i])
//查看当前位置
print( i,index1)
print(nameArr)
}
}
print("值:\(getRandomByArr(arrValue: &nameArr)) ")