1. 程式人生 > >Swift 3.0

Swift 3.0

//
//  main.swift
//  Swift-陣列
//
//  Created by yidong on 16/9/27.
//  Copyright © 2016年 東哥. All rights reserved.
//

import Foundation

/*
 
 Swift 語言中的陣列用來按順序儲存相同型別的資料
 
 */



//1.定義陣列

var numarr:[Int] = [1,3,5,7,9];

var strarr:[String] = ["理想","swift"];




//2.訪問和修改數租

//(1)陣列長度  和 訪問陣列中的某個元素

print("strarr 數租的長度為:\(strarr.count) 陣列的 第1個值為:\(strarr[0])");

//(2)向陣列中追加元素

   strarr.append("ios");

//執行結果:[理想, swift, ios]





//(3)使用加法賦值運算子(+=)也可以直接在陣列後面新增元素(是之前現在不行)
//+=運算子只能用於陣列之間,不能新增單個元素:

//   strarr += "android";

     strarr += ["android"];


//執行結果:[理想, swift, ios, android]



//(4)直接向陣列最後新增一個數組(和(3)一樣)

   strarr+=["AAA","BBB","CCC"];

//執行結果:[理想, swift, ios, android, AAA, BBB, CCC]





//(5)使用Index 向陣列中插入元素

  strarr.insert("000",at:2);

//執行結果:[理想, swift, 000, ios, android, AAA, BBB, CCC]





//(6)使用removeAtIndex 刪除某個陣列元素  注意 removeAtIndex() 是有返回值的,返回的就是刪除的元素

   strarr.remove(at: 2);

//執行結果:[理想, swift, ios, android, AAA, BBB, CCC]





//(7)刪除陣列的最後一個元素

strarr.removeLast();

//執行結果:[理想, swift, ios, android, AAA, BBB]





//(8)使用enumerate函式來遍歷數租 返回值是一個元組

for bgen in strarr
    
{
    
    print("元素下標:\(bgen)  元素值:\(bgen)");
    
}

//執行結果:

/*
 
 元素下標:0  元素值:理想
 
 元素下標:1  元素值:swift
 
 元素下標:2  元素值:ios
 
 元素下標:3  元素值:android
 
 元素下標:4  元素值:AAA
 
 元素下標:5  元素值:BBB
 
 */







//(9)使用構造語法來建立陣列

//建立一個Int資料型別構成的空陣列:

var nums = [Int]();

//建立一個自定義資料型別構成的空陣列:

class Student  // 建立一個類 ,後面會具體說,這裡就是為了得到這個類的型別
    
{
    
    //資料成員和成員函式略
    
    
}

var students = [Student]();  // students 是一個Student 型別的陣列





//(10)建立特定大小並且所有資料都被預設值得陣列

var  nums2 = [Int](repeating:3,count: 5);  // 有5 個元素  元素的值都是 3

print(nums2);

//執行結果:[3, 3, 3, 3, 3]






//(10)陣列的賦值和拷貝行為

/*
 
 特點:陣列的拷貝行為只有在必要時才會發生
 
 
 將一個數組(Array)例項賦給一個變數或常量,或者將其作為引數傳遞給函式或方法呼叫,在事件發生時陣列的內容不會被拷貝。當你在一個數組內修改某一元素,修改結果也會在另一陣列顯示。
 
 
 陣列的拷貝行為僅僅當操作有可能修改陣列長度時才會發生
 
 
 解決陣列拷貝問題: 確保陣列的唯一性
 
 
 */


var testarr1:[Int] = [1,2,3,4,5];

var testarr2=testarr1;

print(" testarr1:\(testarr1)\n testarr2:\(testarr2)");

//執行結果

/*
 
 testarr1:[1, 2, 3, 4, 5]
 
 testarr2:[1, 2, 3, 4, 5]
 
 */


testarr1[1]=1000;//改變testarr1 中第二個(下標為1)的元素的值為 1000 ,**注意:根據陣列的拷貝機制 testarr2也會該改變

print(" testarr1:\(testarr1)\n testarr2:\(testarr2)");

//執行結果

/*
 
 testarr1:[1, 1000, 3, 4, 5]
 
 testarr2:[1, 1000, 3, 4, 5]
 
 */


testarr2.removeLast();//刪除陣列的最後一個元素,改變陣列長度,陣列發生拷貝行為

print(" testarr1:\(testarr1)\n testarr2:\(testarr2)");

testarr1[1]=2;//改變testarr1 中第二個(下標為1)的元素的值為 1000 ,**注意:根據陣列的拷貝機制 testarr2中的元素不在會改變,以為在在陣列長度改變時,已經發生了陣列的拷貝行為

print(" testarr1:\(testarr1)\n testarr2:\(testarr2)");

//執行結果:

/*
 
 testarr1:[1, 2, 3, 4, 5]
 
 testarr2:[1, 1000, 3, 4]
 
 */




//解決陣列拷貝問題: 確保陣列的唯一性

/*
 
 在操作一個數組,或將其傳遞給函式以及方法呼叫之前是很有必要先確定這個陣列是有一個唯一拷貝的。通過在陣列變數上呼叫unshare方法來確定陣列引用的唯一性。(當陣列賦給常量時,不能呼叫unshare方法)
 
 如果一個數組被多個變數引用,在其中的一個變數上呼叫unshare方法,則會拷貝此陣列,此時這個變數將會有屬於它自己的獨立陣列拷貝。當陣列僅被一個變數引用時,則不會有拷貝發生
 
 
 
 */


var testarr4:[Int]=[1,2,3,4,5];

var testarr5=testarr4;

var testarr6=testarr5;

//  testarr5.unshare(); //呼叫 unshare方法,則會拷貝此陣列,此時 testarr5 將會有屬於它自己的獨立陣列拷貝

////在最新的beta3中,Array的行為已經變的和Dictionary一致了,都是值型別,去掉了copy和unshare方法。


//testarr5[2]=0;

print("testarr4: \(testarr4)\n testarr6:\(testarr6)");

//執行結果:

/*
 
 testarr4: [1, 2, 3, 4, 5]
 
 testarr5:[1, 2, 0, 4, 5]
 
 testarr6:[1, 2, 3, 4, 5]
 
 */



//強制複製陣列

/*我們通過呼叫陣列的copy方法進行強制顯性複製。這個方法對陣列進行了淺拷貝(shallow copy),並且返回一個包含此拷貝的新陣列。
 
 */



var names = ["Mohsen", "Hilary", "Justyn", "Amy", "Rich", "Graham", "Vic"]

//var copiedNames = names.copy();//在最新的beta3中,Array的行為已經變的和Dictionary一致了,都是值型別,去掉了copy和unshare方法。

//copiedNames[0] = "Mo"

print(names[0]);