swift 5. 数组

标签:swift

妈蛋,真不容易啊,终于要说集合了。哎╮(╯▽╰)╭。这进度太慢了啊!

swift中的集合分好几种,他们统统成为集合类型。还是PHP大发好啊,一个数组类型就搞定所有。

按照可以是否存在相同类型的数据,具体分为,以下:

  • 数组 Arrays
  • 字典 Dictionaries

数组 Arrays

swift中的数组跟java和c 一样,只能包含相同类型的成员数据,要么全是整型,要么全是字符串,不能几种不同的类型混在一块,要是你想混在一起就得用object-c语言里面的的NSArray类型,最后会说到。

0. 申明一个数组

如何申明一个数组呢,和javascript是一样的,用[]表示。但是,我们要申明这个数组是要有变量类型的。所以,要用[类型]来标记。

//先申明
var array1:[String]

//后赋值
array1 = ["ab","cb","ed"]

print(array1) // 打印:[ab,cb,ed]

或者是申明和赋值连着一起来:

//申明赋值一起来
var array2:[Int] = [1,2,3,4,5,6]

print(array2)

上面2种方法都是先申明,后赋值了。swift中还有一种申明数组的方式,是申明一个空数组,或者叫先申明一个数组,给它附上空值。因为一个数组光申明,如果不初始化赋值,打印它是会报错。

var array6 = [Int]() //申明Int类型数组并初始化赋值为空
var array8 = [String]() //申明String类型数组并初始化赋值为空
print(array6)

我们也可以在申明一个数组后,给它设定默认的值:
var array = [type](count: count,repeatedValue:"value")
type 表示填充的变量类型。count 表示数组大小,repeatedValue 表示填充的值是什么。

var threeString = [String](count: 3,repeatedValue:"hello")
var threeInt= [Int](count: 3,repeatedValue:8)

print(threeString) // [hello,hello,hello]
print(threeInt) // [8,8,8]

或者直接去掉变量类型,swift会自动判断的:
var array = Array(count: count,repeatedValue:"value")

var threeString = Array(count: 3,repeatedValue:"hello")

print(threeString) // [hello,hello]

之前我们就说过,swift中的变量的类型,我们是可以省略的,就像javascript的写法一样所以,swift会自动识别它的类型,所以一般我们会这样来表示一个数组:

var array3 = [1,5]
var array4 = ["a","b","c","d"]
var array5 = ["0",1,"ere"]

//输出
print(array3)
print(array4)
print(array5)

//屏幕输出结果
[1,5]
[a,b,c,d]
[1,"2111"]

注意
我们看到array5中居然是不同的数据类型成员,但是,编辑器没报错?你不是说swift中的数组是严格要求类型的吗?会报错吗?怎么这个是好的,还输出了。

因为,我们采用的是省略的写法,它就自动识别成[NSObject]类型了。所以也是正确的。最好不要用这种用法。

其他语言中是怎么申明和赋值数组的呢?

先是java,哎,Java的一切都是蛋疼的,因为它推崇一切都是对象,所以,数组也是对象,也要new 初始化。

/* java */

//1 先申明,再new
String array1[];
array1 = new String[3];
//只能一个一个赋值
array1[0]= "ww";
array1[1]= "ww";
array1[2]= "ww";
//array1[3]= "ww"; //因为只申明了3个值,这个就溢出了,报错。蛋疼!

// 2. 一起
String array2[] = new String[3];
//只能一个一个赋值
array2[0]= "ww";
array2[1]= "ww";
array2[2]= "ww";

//第二种方式,一步到位,并赋值
String array3[] = {"ww","fg","ere"};
//这个时候只能修改原来的值了,不能新增值,因为只有3个
array3[0] = 123; // 不匹配,报错,只能是字符串
array3[3] = "erd"; // 溢出了,报错!


for (String i:array3) {
    System.out.println(i);
}

PHP中当然是最爽的啦。随意使用!真是太爽了。

$a = []; //当然这一句也可以不要,也不会错
$a = [
    1,"wohahah","xixii"
];
$a[55] = "566";

javascript中,和swift很像

var array1[]; //申明一下。
array1= [1,5];//赋值
array1[0] = 9; //修改

1. 求数组大小

swift中也是用count来求数组大小,但是它是个数组的一个属性值,不是一个函数方法。

var array8 = [1,6,7,8,9];

var array_8_count = array8.count;

print("array8数组的大小为:\(array_8_count)")
//输出: array8数组的大小为:9

2. 判断数组是否为空

用属性isEmpty 来判断,它返回一个boolean值,true或false

if array8.isEmpty {
    print("The array8 is empty.")
} else {
    print("The array8 is not empty.")
}

3. 访问和修改数组成员

上面我们申明了很多数组,我们想要访问里面的某一个成员,比如访问第N个的值,我们可以和其他语言一样,用array[N]来访问的。

var shoppingList = ["Eggs","Milk"]
var index_0 = shoppingList[0];
var index_1 = shoppingList[1];

print(index_0); //输出Eggs
print(index_1); //输出Milk

既然我们可以通过array[0]这样的方式取到第0个值,我们也同样可以用array[0] = "Pig"这样的方式,给第0个成员重新赋值,因为这个数组申明的为var变量,是可以重新修改赋值的,注意 如果是申明为let常量就不能这样改动了

var shoppingList = ["Eggs","Milk"]

shoppingList[0] = "Pig" //将第0个元素重新赋值位Pig
shoppingList[1] = "Dog" //将第1个元素重新赋值位Dog

var index_0 = shoppingList[0];
var index_1 = shoppingList[1];

print(index_0); //Pig
print(index_1); //Dog

注意
下面会出现一个问题,也是极其容易想当然出错的。上面我们申明shoppList数组长度为2,那么它就限定死了。它的长度为2了。如果你通过array[2] = "hello"这种方式给它加上第3个成员,是会报错Fatal error: Array index out of range

var shoppingList = ["Eggs","Milk"]
shoppingList[2] = "Hello" //报错:Fatal error: Array index out of range

那,难道我们就不能给一个预先定义的数组扩充吗?当然可以。看下面:

使用区间来修改数组

var onetoFive = [1,5] 

onetoFive[0...2] = [6,8]  // 0-2的索引值变成6.7.8
print(onetoFive) // [6,7,4,5]

onetoFive[0..<3] = [9] // 把 0-2的全变成9
print(onetoFive) // [9,5]

4. 向数组后追加新的成员

上面我们看到了,强行给数组添加新的成员是会报错的,那如何向数组后面追加新的成员呢?swift里也有这样一个方法函数append(),它是一个数组对象的一个方法,可以向这个数组后添加成员。

var animals = ["pig","dog","cat"]

animals.append("monkey")

print(animals) //输出:[pig,dog,cat,monkey]
print(animals[3]) // 输出:monkey

5. 向里数组任意某个索引值之前添加数据

append()方法是向数组的最后面追加数据,感觉比较鸡肋,不灵活,swift中的一个方法insert("value",atIndex: index)就非常灵活了。可以往任意索引前追加数据,记住,是往前。注意 : 后面的atIndex一定要写,不能省略。

var foods = ["egg","bread","rice"]
//往第0个索引,也就是egg,前面添加icecream。
foods.insert("icecream",atIndex:0)
//往第一个索引,注意,这时候,egg就变成第1个数据了。
foods.insert("humbeag",atIndex:1)

print(foods)
//打印:[icecream,humbeag,egg,bread,rice]

那么,既然有向前某个索引值钱追加,有往某个索引值后面追加的函数吗?对不起!没有。啊。你会觉得苹果很操蛋啊。其实不是。insert("value",atIndex:index)这个函数是往前追加,按照相对论的定义,不也是在往index-1的后面在追加数据吗?

var foods = ["egg","rice"]

//我想往第1个索引值,也就是bread后面追加banana,其实,也就是在rice,index=2前面追加了,对不对。
foods.insert("banana",atIndex: 2)

println(foods) //输出:[egg,banana,rice]

7. 获取数组的第一个元素和最后一个元素

获取第一个元素和最后一个元素,返回的是可选型

var vowels: [Int] = [1,5]

print(vowels.first) // Optional(1)
print(vowels.last) // Optional(5)

//因为是可选型,所以用if let解包下
if let firstVowel = vowels.first{
    print("The first vowel is ",firstVowel) // The first vowel is 1
}

//强型解包
print(vowels.first!) // 1

vowels[vowels.count-1] // 5

8. 最大值、最小值

获取最小,最大值,返回的也是可选型

vowels.minelement() // Optional(1)
vowels.maxElement() // Optional(5)

9. 获取数组区间内的值

获取使用一个区间内的值。

vowels[1...2] // 从第2个-第3个的值: [2,3]
vowels[1..<2] // 从第2个-第3个的值,不包含3 : [2]

vowels[1...vowels.count - 1] //取出 第 2个到最后一个的值: [2,3,5]

10. 数组包含

一个数组内是否包含一个值:Array.contains[n]。返回truefalse

vowels.contains(1) // true
 vowels.contains(33) // false

let letter = 2
if vowels.contains( letter ){
    print("\(letter) is a vowel") // 输出这句
}
else{
    print("\(letter) is not a vowel")
}

查看一个元素在一个数组中的索引位置:Array.indexOf[n]。 返回的是可选类型。

var vv1 = vowels.indexOf(1) //1这个元素在0的索引上。
print(vv1) // Optional(0)

var vv2 = vowels.indexOf(8) //没有8这个元素,返回nil
print(vv2) // nil

11. 合并数组

可以用+=操作符号,来扩充数组,或者合并几个数组。arrray1+=[“value1”,”value2”] ,必须是相同类型的数据。

var mobile = ["iphone","htc","moto"]

mobile+=["huawei","lenove",]
mobile+=[4565] //类型不相同,报错。

var mobile2 = ["nokia"]
mobile += mobile2
//拆开也可以
var mobile3 = mobile + mobile2

print(mobile3)
// 输出:[iphone,htc,moto,huawei,lenove,'nokia']

12. 删除某个索引值的数据

删除某个索引的值,可以用removeAtIndex(index)来移除,返回值是移除的这一项的值。

var mobile3 = ["iphone","moto","nokia"]
var who = mobile3.removeAtIndex(3)
print(who) // 打印:nokia
print(mobile3) // 打印:[iphone,moto] nokia被移除了。

删除第一项和最后一项,可以用removeFirst()removeLast(),返回的是移除的这一项的值。

var mobile3: [String] = ["iphone","nokia"]
var who1 = mobile3.removeFirst()
print(who1) // 打印:iphone

var who2 = mobile3.removeLast()
print(who2) // 打印:nokia

print(mobile3) // 打印:["htc","moto"] iphone,nokia被移除了。

删除所有,用:removeAll() 。它返回删除的值。

var mobile3: [String] = ["iphone","nokia"]
mobile3.removeAll()

删除一个区间:removeRange(1...3) ,没返回值。

var mobile3: [String] = ["iphone","nokia"]
mobile3.removeRange(1..<2) //删除了 htc
mobile3.removeRange(1...2) //删除了 htc 和 moto

13. 遍历数组

遍历数组,我们直接用for语句循环。以后将for会着重说:

for i in shoppingList {
    print(i)
}
//输出:
Pig
Dog
hello

或者我们想吧索引值也给循环出来,得用到枚举了。以后也会说到:

for (index,value) in enumerate(shoppingList) {
    print("Item \(index): \(value)")
}
//输出
Item 0: Pig
Item 1: Dog
Item 2: hello

14. 数组比较

swift中数组比较用==。它比较的的是值,和其它语言不一样。所以,比较2个数组,只要值是一摸一样就会相等。

var onetoFive = [1,5]
var numbers = [1,5]
numbers == onetoFive // true

//顺序变化就不想等了
var onetoFive2 = [1,5] 
numbers == onetoFive2 //false

15. 二维数组

//二维数组的声明
var board = [ [1024,16,2,0],[256,4,[64,0,[2,0] ]
//var board:[[Int]] = [ [1024,16,2,0],[256,[64,[2,0] ]
//var board:[Array<Int>] = = [ [1024,0] ]
//var board:Array<[Int]> = [ [1024,0] ]
//var board:Array<Array<Int>> = [ [1024,0] ]


// 二维数组获取元素
board[0]
board[0][0]


// 获取二维数组两个维度的信息
board.count
board[0].count


// Swift中的二维数组,每一维度的元素数目可以不同
board[0].append(0)
board


// 为二维数组的第一个维度添加的元素是一个数组
board.append([0,0])
board += [ [0,0] ]
board

NSArray

NSArray数组是swift的前任objective-c里的声明数组的方式,在swift也被沿用了过来。简单说下,怎么使用,用的不多了。

//默认这样声明,不加类型,就是声明一个 NSArray
var Narray1 = []

// 用as 关键字转换
var Narray2 = [1,5] as NSArray

//显示的声明
var Narray3: NSArray = [1,"hello"]

var Narray4: [NSObject] = [1,"hello"]

好了。数组也说到这了。妈的。太不容易了。

swift 5. 数组的更多相关文章

  1. html5 canvas合成海报所遇问题及解决方案总结

    这篇文章主要介绍了html5 canvas合成海报所遇问题及解决方案总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Html5移动端适配IphoneX等机型的方法

    这篇文章主要介绍了Html5移动端适配IphoneX等机型的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  3. 有关HTML5页面在iPhoneX适配问题

    这篇文章主要介绍了有关HTML5页面在iPhoneX适配问题,需要的朋友可以参考下

  4. Html5 页面适配iPhoneX(就是那么简单)

    这篇文章主要介绍了Html5 页面适配iPhoneX(就是那么简单),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  5. H5页面适配iPhoneX(就是那么简单)

    这篇文章主要介绍了H5页面适配iPhoneX(就是那么简单),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  6. ios – 在没有iPhone6s或更新的情况下测试ARKit

    我在决定下载Xcode9之前.我想玩新的框架–ARKit.我知道要用ARKit运行app我需要一个带有A9芯片或更新版本的设备.不幸的是我有一个较旧的.我的问题是已经下载了新Xcode的人.在我的情况下有可能运行ARKit应用程序吗?那个或其他任何模拟器?任何想法或我将不得不购买新设备?解决方法任何iOS11设备都可以使用ARKit,但是具有高质量AR体验的全球跟踪功能需要使用A9或更高版本处理器的设备.使用iOS11测试版更新您的设备是必要的.

  7. ios – containerURLForSecurityApplicationGroupIdentifier:在iPhone和Watch模拟器上给出不同的结果

    我使用默认的XCode模板创建了一个WatchKit应用程序.我向iOSTarget,WatchkitAppTarget和WatchkitAppExtensionTarget添加了应用程序组权利.(这是应用程序组名称:group.com.lombax.fiveminutes)然后,我尝试使用iOSApp和WatchKitExtension访问共享文件夹URL:延期:iOS应用:但是,测试NSURL

  8. ios – 声明NSDictionary并在Swift中添加键值对?

    我一直在尝试使用类类型键和值来声明一个NSDictionary,如下所示:这里,“Category”和“SubCategory”是全局类.我知道我不能将类类型用于关键字段.但是,无论如何,我应该做到这一点.有没有办法做到这一点?如何声明专门的NSDictionary或类似的东西来做到这一点?

  9. ios – Trello iPhone应用程序是如何开发的?

    我想知道Trelloiphone应用程序正在使用哪些库或框架.它是一个JS框架的webapp?我很好奇,因为我非常喜欢用户界面,并且在没有运气的情况下搜索了互联网.解决方法我在Trello团队中编写了iPhone应用程序.它是除了附件查看器之外的所有本机代码,它只是一个WebView.我们使用RestKit与我们的API进行通信,并帮助将数据本地缓存到CoreData.否则,它只是一堆自定义UIViews和UIViewControllers.

  10. 真正的iOS设备和Watch Simulator可以进行通信以进行测试

    我想为现有的iOS应用创建一个手表应用.但我处于一种情况,我没有苹果手表,我现有的iOS应用程序只能在不在模拟器上的真实设备上运行.是否可以在iPhone设备上运行应用程序并在手表模拟器中测试我的手表应用程序?解决方法至少在目前,不可能配对真正的iPhone和Watch模拟器.我得出这个结论有三个原因:>Watch模拟器在安装过程中自动与iPhone模拟器配对.>根本无法从界面取消配对Watch模拟器.>在模拟器上无法访问蓝牙以与真实设备进行通信.这是一个proof.

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部