最近在看個洗牌算法.想用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)) ")