array预防越界 swift
2017-05-11 11:00:30 qq_37269542 阅读数 341

在使用textView这个控件时候需要有时候会出现越界的提示如下:

requesting caretRectForPosition: while the NSTextStorage has oustanding changes{520,4}

对于这个报错我发现自己的code对字数的限制并没有问题,而且断点无法跟到具体的越界位置,代理方法都走完了之后才出现问题,并且把所有的代理方法都给注释掉了以后发现还是有这个exception,这就说明和textView的这个控件的代理当法没有关系,于是乎想到应该是在code的其他的地方做了一些的设置使的出现了越界,因为一般出现越界的情况都是某个变量的越界,只要找到这个变量就能解决问题。

于是我就找了code中所有与textView这个控件相关的code。最终找到了原因所在,这个问题是出现在我回收键盘的时候,使用的方法不当所致

我所使用的是以下这个函数(错误的方法):

func scrollViewDidScroll(scrollView: UIScrollView) {
    textView.resignFirstResponder()
}


使用以下这个方法回收键盘就不会出现越界的问题(正确的方法):

func scrollViewWillBeginDragging(scrollView: UIScrollView) {
    textView.resignFirstResponder()
}


2016-06-21 09:44:00 weixin_30602505 阅读数 4

//

//  main.Swift

//  swift数组

//

//  Created by zhangbiao on 14-6-15.

//  Copyright (c) 2014 理想. All rights reserved.

//


import Foundation


println("数组")


/*

Swift 语言中的数组用来按顺序存储相同类型的数据

*/



//1.定义数组

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

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




//2.访问和修改数租

//(1)数组长度  和 访问数组中的某个元素

println("strarr 数租的长度为:\(strarr.count) 数组的 第1个值为:\(strarr[0])");

//(2)向数组中追加元素

strarr.append("iOS");

//运行结果:[理想, swift, ios]





//(3)使用加法赋值运算符(+=)也可以直接在数组后面添加元素

strarr+="Android";

//运行结果:[理想, swift, ios, android]






//(4)直接向数组最后添加一个数组

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

//运行结果:[理想, swift, ios, android, AAA, BBB, CCC]





//(5)使用Index 向数组中插入元素

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

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





//(6)使用removeAtIndex 删除某个数组元素  注意 removeAtIndex() 是有返回值的,返回的就是删除的元素

strarr.removeAtIndex(2);

//运行结果:[理想, swift, ios, android, AAA, BBB, CCC]





//(7)删除数组的最后一个元素

strarr.removeLast();

//运行结果:[理想, swift, ios, android, AAA, BBB]





//(8)使用enumerate函数来遍历数租 返回值是一个元组

for bgen in enumerate(strarr)

{

    println("元素下标:\(bgen.0)  元素值:\(bgen.1)");

}

//运行结果:

/*

元素下标: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[](count: 5, repeatedValue:3);  // 5 个元素  元素的值都是 3

println(nums2);

//运行结果:[3, 3, 3, 3, 3]






//(10)数组的赋值和拷贝行为

/*

特点:数组的拷贝行为只有在必要时才会发生


将一个数组(Array)实例赋给一个变量或常量,或者将其作为参数传递给函数或方法调用,在事件发生时数组的内容不会被拷贝。当你在一个数组内修改某一元素,修改结果也会在另一数组显示。


数组的拷贝行为仅仅当操作有可能修改数组长度时才会发生


解决数组拷贝问题: 确保数组的唯一性


*/


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

var testarr2=testarr1;

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

//执行结果

/*

testarr1:[1, 2, 3, 4, 5]

testarr2:[1, 2, 3, 4, 5]

*/


testarr1[1]=1000;//改变testarr1 中第二个(下标为1)的元素的值为 1000 ,**注意:根据数组的拷贝机制 testarr2也会该改变

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

//执行结果

/*

testarr1:[1, 1000, 3, 4, 5]

testarr2:[1, 1000, 3, 4, 5]

*/


testarr2.removeLast();//删除数组的最后一个元素,改变数组长度,数组发生拷贝行为

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

testarr1[1]=2;//改变testarr1 中第二个(下标为1)的元素的值为 1000 ,**注意:根据数组的拷贝机制 testarr2中的元素不在会改变,以为在在数组长度改变时,已经发生了数组的拷贝行为

println(" 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 将会有属于它自己的独立数组拷贝

testarr5[2]=0;

println("testarr4: \(testarr4)\n testarr5:\(testarr5) \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();

copiedNames[0] = "Mo"

println(names[0]);

// 执行结果: Mohsen



//说明:如果你仅需要确保你对数组的引用是唯一引用,请调用unshare方法,而不是copy方法。unshare方法仅会在确有必要时才会创建数组拷贝。copy方法会在任何时候都创建一个新的拷贝,即使引用已经是唯一引用。

转载于:https://www.cnblogs.com/Free-Thinker/p/5602575.html

2016-06-21 09:44:00 weixin_30664539 阅读数 1

//

//  main.Swift

//  swift数组

//

//  Created by zhangbiao on 14-6-15.

//  Copyright (c) 2014 理想. All rights reserved.

//


import Foundation


println("数组")


/*

Swift 语言中的数组用来按顺序存储相同类型的数据

*/



//1.定义数组

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

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




//2.访问和修改数租

//(1)数组长度  和 访问数组中的某个元素

println("strarr 数租的长度为:\(strarr.count) 数组的 第1个值为:\(strarr[0])");

//(2)向数组中追加元素

strarr.append("iOS");

//运行结果:[理想, swift, ios]





//(3)使用加法赋值运算符(+=)也可以直接在数组后面添加元素

strarr+="Android";

//运行结果:[理想, swift, ios, android]






//(4)直接向数组最后添加一个数组

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

//运行结果:[理想, swift, ios, android, AAA, BBB, CCC]





//(5)使用Index 向数组中插入元素

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

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





//(6)使用removeAtIndex 删除某个数组元素  注意 removeAtIndex() 是有返回值的,返回的就是删除的元素

strarr.removeAtIndex(2);

//运行结果:[理想, swift, ios, android, AAA, BBB, CCC]





//(7)删除数组的最后一个元素

strarr.removeLast();

//运行结果:[理想, swift, ios, android, AAA, BBB]





//(8)使用enumerate函数来遍历数租 返回值是一个元组

for bgen in enumerate(strarr)

{

    println("元素下标:\(bgen.0)  元素值:\(bgen.1)");

}

//运行结果:

/*

元素下标: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[](count: 5, repeatedValue:3);  // 5 个元素  元素的值都是 3

println(nums2);

//运行结果:[3, 3, 3, 3, 3]






//(10)数组的赋值和拷贝行为

/*

特点:数组的拷贝行为只有在必要时才会发生


将一个数组(Array)实例赋给一个变量或常量,或者将其作为参数传递给函数或方法调用,在事件发生时数组的内容不会被拷贝。当你在一个数组内修改某一元素,修改结果也会在另一数组显示。


数组的拷贝行为仅仅当操作有可能修改数组长度时才会发生


解决数组拷贝问题: 确保数组的唯一性


*/


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

var testarr2=testarr1;

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

//执行结果

/*

testarr1:[1, 2, 3, 4, 5]

testarr2:[1, 2, 3, 4, 5]

*/


testarr1[1]=1000;//改变testarr1 中第二个(下标为1)的元素的值为 1000 ,**注意:根据数组的拷贝机制 testarr2也会该改变

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

//执行结果

/*

testarr1:[1, 1000, 3, 4, 5]

testarr2:[1, 1000, 3, 4, 5]

*/


testarr2.removeLast();//删除数组的最后一个元素,改变数组长度,数组发生拷贝行为

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

testarr1[1]=2;//改变testarr1 中第二个(下标为1)的元素的值为 1000 ,**注意:根据数组的拷贝机制 testarr2中的元素不在会改变,以为在在数组长度改变时,已经发生了数组的拷贝行为

println(" 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 将会有属于它自己的独立数组拷贝

testarr5[2]=0;

println("testarr4: \(testarr4)\n testarr5:\(testarr5) \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();

copiedNames[0] = "Mo"

println(names[0]);

// 执行结果: Mohsen



//说明:如果你仅需要确保你对数组的引用是唯一引用,请调用unshare方法,而不是copy方法。unshare方法仅会在确有必要时才会创建数组拷贝。copy方法会在任何时候都创建一个新的拷贝,即使引用已经是唯一引用。

转载于:https://www.cnblogs.com/Free-Thinker/p/5602575.html

2016-12-20 21:22:31 L_is_puck 阅读数 146

//数组的创建

let array = ["name","age","height"]

var arrayM = [String]()

var arrayN = Array<String>()


//数组的基本操作

arrayM.append("num")

arrayM.append("score")

arrayM.append("Star")


//删除元素

arrayM.remove(at: 0)

arrayM.removeFirst()

arrayM.removeLast()

arrayM.removeAll()

arrayM


//修改元素

var arrayX = ["1","2","3","4"]

arrayX[0] = "0"


//遍历数组

for i in 0..<arrayX.count {

    print(arrayX[i])

}


for name in arrayX {

    print(name)

}


for name in arrayX[0..<2]{

    print(name)

}


//数组合并 只有并类型数组才能用 + 合并

let newArray = array+arrayX

print(newArray)

2016-07-15 14:16:47 liuwin7 阅读数 805

1.相遇

有个业务需求,把表格中的数据整合到一个数组中,如下

Name Age Item1 Item2 Item3 Country
Jack 21 32 43 null China
Tom 23 83 67 75 US

整合后的结果是这样

[
    {
        "Name": "Jack",
        "Age": 21,
        "score": [
            {
                "Item1": 32
            },
            {
                "Item2": 43
            }
        ],
        "Country": "China"
    },
    {
        "Name": "Tom",
        "Age": 23,
        "score": [
            {
                "Item1": 83
            },
            {
                "Item2": 67
            },
            {
                "Item3": 75
            }
        ],
        "Country": "US"
    }
]

有个中间的状态,就是把一条记录整合出来之后,取中间的几个元素作为一个整体,所以需要把中间的几个数据切片到一个新的数组中。
之前在学习Swift的时候,了解过一下数组的用法,以为是非常了解了,实则不然。

2.对于切片数组的 subscript ,你了解多少?

一个简单例子

let array = ["A", "B", "C", "D"]
let slicedArray = array[1..<3]
print(slicedArray.count) // 2
print(slicedArray[0]) // error

WHY?

明明数组中有两个元素,但是为什么用subscript访问,却报错呢?
还有

let slicedArray String = slicedArray.reduce("start: ") { (acc, item) -> String in
    "\(acc)\(item)"
}
print(slicedString) // start: BC

很明显这个”数组”中是有数据的呀,怎么就是取不出来呢?

3.startIndex & endIndex

slicedArray 的 startIndex 和 endIndex 是多少呢?

print(slicedArray.startIndex) // 1 instead 0
print(slicedArray.endIndex) // 3

所以,在用[0]访问slicedArray的时候,其实是越界的 out of bounds !!!!

4.怎么解决这个问题

不去详细的解释为什么,这个跟swift对数组的设计理念相关,copy-on-write,目的之一提高性能
两个方案解决这个问题:

  1. 违背swift的设计原则
    直接创建一个新的数组变量

    let lastedArray = Array(array[1..<3])
    print(lastedArray.startIndex) // 0
    print(lastedArray.endIndex) // 2
    print(lastedArray[0]) // B
  2. 使用数组的属性startIndex,endIndex

    combinedArray[combinedArray.startIndex] // B
    combinedArray[combinedArray.startIndex.advancedBy(1)] // C

5.参考文献

  1. swift-subarrays-array-and-arrayslice
  2. swift-array-and-arrayslice-xcode-7.2

Swift 数组(Array)

阅读数 209

Swift - use Array

阅读数 7

Swift的Optional、Array

阅读数 593

swift Array 数组

阅读数 35017

没有更多推荐了,返回首页