array的第几个 swift

2014-11-13 23:36:26 NapoleonBai 阅读数 2202

一天一点,好好学习

前进就是动力,动力推动前进

数组:

数组使用有序列表存储同一类型的多个值,相同的值可以多次出现在同一个数组的不同位置.

Swift数组特定于它所存储元素的类型.这与OC的NSArray和NSMutableArray不同,这两个类可以存储任意类型的对象,并且不提供所返回对象的任何特定信息.在swift中,数据值在呗存储进入某个数组之前必须明确,方法是通过显示的类型标注或类型推断,而且不是必须是Class类型.

eg:

我们创建了一个Int类型的数组,那么我们就不能往里面存储其他类型的数据.

因此,Swift中的数组是类型安全的,并且它们包含的类型必须明确.

好啦:口水话也不多说了,看Code明确一切:走起

//
//  ViewController.swift
//  SwiftArrayAndDictionary
//
//  Created by NapoleonBai on 14-11-13.
//  Copyright (c) 2014年 NapoleonBai. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        self.managerArray()
    }
    /**
    此函数用来管理数组
    */
    func managerArray(){
        //定义一个数组对象
        //1.不指定参数类型
        var array = ["曹操","刘备","孙权"]
        
        println("array 一共有 \(array.count) 个item")   //array 一共有 3 个item
        
        //2.指定数组类型
        var arrayTwo : [String] = ["魏","蜀","吴"]
        //如果采用 String[] ,这里会抛出error,这种做法是在开始的beta版允许
        
        if arrayTwo.isEmpty{
            //这是数组自带的方法,用来判断是否为空
            println("arrayTwo 为空,没有元素可取")

        }else{
            println("arrayTwo 第一个选项为: \(arrayTwo[0])")  //arrayTwo 第一个选项为: 魏
        }
        
        //这里的取值方式同多种语言一样,都是根据下标获取
        
        //3.创建空数组
        var arrayThree = [Int] ()
        
        //使用append添加数组元素
        arrayThree.append(999)
        
        arrayThree.append(888)
        
        
        println("arrayThree 的值为 \(arrayThree)") //arrayThree 的值为 [999, 888]
        
        //4.创建指定大小的数组,并赋值
        var arrayDoubles = [Double](count: 5, repeatedValue: 0.0)
        
        println("the arrayDoubles = \(arrayDoubles)")   //the arrayDoubles = [0.0, 0.0, 0.0, 0.0, 0.0]
        
        //so,我们怎样拼接两个数组呢?那么请看
        // 通过类型自动推测,不用指定特定类型
        var arrayOtherDoubles = Array(count: 3, repeatedValue: 99.9)
        
        // 两个数组相加,新数组的类型会根据这两个数组的类型推断出来
        // 特别注意,一般只支持同类型的数组相拼接
        var addDoubles = arrayDoubles + arrayOtherDoubles
        
        println("addDoubles = \(addDoubles)")   //addDoubles = [0.0, 0.0, 0.0, 0.0, 0.0, 99.9, 99.9, 99.9]
        
        //当然,如果
        //eg:
        var arrayTest = Array(count:2,repeatedValue:"哈哈")
        
        //var arrarAddTest = arrayDoubles + arrayTest  //error: Cannot invoke '+' with an argument list of type '(@lvalue [(Double)],@lvalue Array<String>)'
        
        var arrayTestTwo = [Int](count: 2, repeatedValue: 33)
        
       //var arrayAddTest = arrayDoubles + arrayTestTwo //error:同上种类型类似
        
        
        //继续添加arrayTwo数组中
        arrayTwo.append("三国魏")
        
        arrayTwo.append("三国蜀")
        
        arrayTwo.append("三国吴")
        //这样的话,arrayTwo中有六个元素了
        
        println("the arrayTwo = \(arrayTwo)")   //改变前:the arrayTwo = [魏, 蜀, 吴, 三国魏, 三国蜀, 三国吴]
        
        //如果我们想更换其中的元素,那么我们应该怎么做呢?
        
        //arrayTwo[6]="三国蜀黍" // fatal error: Array index out of range
        //println("the arrayTwo[6] = \(arrayTwo[6])")
        //下标越界了,不好意思,一下子就忘了哈,那如果我们遇到了该怎么处理呢?
        //先暂时保留这个问题哈
        
        arrayTwo[5] = "三国蜀黍"
        
        println("the arrayTwo = \(arrayTwo)")   //改变后:the arrayTwo = [魏, 蜀, 吴, 三国魏, 三国蜀, 三国吴]

        //如果,我们需要在某个值之间插入某个值了,怎么办?
        //下面我们就在数组第一个位置插入'小白杨'
        arrayTwo.insert("小白杨", atIndex: 0)
        
        println("the arrayTwo = \(arrayTwo)")   //the arrayTwo = [小白杨, 魏, 蜀, 吴, 三国魏, 三国蜀, 三国蜀黍]

        //然后我们发现,我们insert错了数组,于是乎,就需要删除这个值,是不是?
        //好吧,我们怎么删除呢?
        //eg:
        arrayTwo.removeAtIndex(0)
        
        println("remove index=0 item after ,the array = \(arrayTwo)")   //remove index=0 item after ,the array = [魏, 蜀, 吴, 三国魏, 三国蜀, 三国蜀黍]
        
        //看到了吧果然删除了,当然了,删除还有
        //arrayTwo.removeLast()         //移除最后一个元素
        //arrayTwo.removeAll(keepCapacity: true)    //移除所有元素
        
        //到这里,数组就差不多讲解完毕了
        //当然,上面提到一个问题,就是数组越界的问题,那么我们怎么处理呢?
        //这就很简单了嘛,判断一下下就OK了呀...嘻嘻
     
        //对了,搬回来一下下,还有很强大的数组遍历还没有提到,是不是?
        //嘻嘻,继续
        
        for tempData in arrayTwo{
            println("the tempData=\(tempData)")
            /*
            the tempData=魏
            the tempData=蜀
            the tempData=吴
            the tempData=三国魏
            the tempData=三国蜀
            the tempData=三国蜀黍
            */
        }
        //其实在前面已经说过了,只是本篇没有而已
        //为什么不需要var tempData呢?这个就是for遍历提供的方便了,in 前面的自动设置为临时变量,我们只需要负责命名即可
        //那还有没有其他遍历方式呢?请看下面
        
        for (index, value) in enumerate(arrayTwo) {
            println("第 \(index + 1) 个元素: \(value)")
            /*
            第 1 个元素: 魏
            第 2 个元素: 蜀
            第 3 个元素: 吴
            第 4 个元素: 三国魏
            第 5 个元素: 三国蜀
            第 6 个元素: 三国蜀黍
            */
        }
        /*
        这是使用全局enumerate函数来进行数组遍历,因为enumerate返回一个由每一个数据项索引值和数据值组成的元组,即可得到索引值和值,根据个人需要吧
        当然,还有更多的方式,就靠自己去挖掘了...
        开挖掘机去...嘻嘻
        那么,问题来了...
        */
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

今天的注释有点稀疏,因为想把文字多提出来写,但是发现时间又不是很多.

吃掉晚饭已是九点多,然后看点其他的东东,再研究一下这个,就很晚了... ... 

所以很多能节省就节省了...嘻嘻

不过,有什么不清楚的,可以提出来,大家一起研究研究,毕竟,我也刚开始学.

当然了,这里的code,抛开了beta版的使用方式,所以,勿怪

时间不早了,洗洗睡吧

当然,不得不多提一句:

如果用var 定义的数组,那么可以手动添加元素,比如append,insert这样,并且也可以修改:array[0]="update"

如果用let定义的数组,那么就不能了.也类似于可变和不可变之分吧


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

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
2015-07-03 23:04:00 weixin_33922672 阅读数 57

Swift中可以使用构造语法来创建一个指定数据类型的空数组,比如:

var someInts = [Int]()

someInts是一个Int类型的空数组。

也可以在初始化时加上元素数量和默认值的定义:

var someInts = [Int](count: 3, repeatedValue:5)

这时someInts是一个长度为3的数组,3个元素的默认值都是Int类型的5。

值得注意的是,Swift是可以类型推断的,我们可以不用手动指定[Int],可以:

var someInts = Array(count:3, repeatedValue:5)

同样的,长度3,默认值都是5。

tips:

本文由wp2osc导入,原文链接:http://devonios.com/swift-array-init.html

由于OSChina的OpenAPI在处理content参数时会自动过滤img标签,所以无法显示图片,详见

转载于:https://my.oschina.net/lijialong/blog/474377

2019-04-01 11:11:21 YY_Seven 阅读数 1369
//获取数据
func setLocalData() {
        self.showHUD()
        self.task = FetchManager.share.fetchBrandList(
            success: { [unowned self] (list) -> (Void) in
                DispatchQueue.main.async {
                    self.hidHUD()
//取返回的model对象list数组的前8个,放到brandButtonsArray数组里。如果返回的list少于8个,也不会有问题,有几个显示几个。写法就是下面这样,当然还有别的。
                    self.brandButtonsArray = [] + list.prefix(8)
//拿到数据去创建button
                    self.setBrandButtbons()
            }
               
        }, failure: { (error) in
            DispatchQueue.main.async {
                self.hidHUD()
                self.showSystemAlert(error.errorDescription)
            }
        })
       
    }
 func setBrandButtbons() {
        let itemSpace: CGFloat = 10.0
        let width = (kScreenWidth - 5.0*itemSpace)/4.0
        let height = width * 60 / 72
        
        var lastButton: UIButton?
        for (index, value) in self.brandButtonsArray.enumerated() {
            let xIndex =  index % 4
            let yIndex = index / 4
            let x = itemSpace + CGFloat(xIndex)*(width + itemSpace)
            let y = 45 + CGFloat(yIndex)*(height + itemSpace)
            let itemButton = UIButton(frame: CGRect(x: x, y: y, width: width, height: height))
            
            itemButton.sd_setImage(with: URL(string: value.markPhotoPath!), for: .normal, placeholderImage: Utility.share.placeholderImage)

            itemButton.layer.cornerRadius = 2
            itemButton.layer.masksToBounds = true
            itemButton.layer.borderWidth = 1
            itemButton.layer.borderColor = CCGrayBorderColor.cgColor
            itemButton.tag = index
            itemButton.addTarget(self, action: #selector(itemButtonHandler(_:)), for: .touchUpInside)
            self.brandView.addSubview(itemButton)
            lastButton = itemButton
        }
        
        if let _ = lastButton {
            self.brandViewHeight.constant = lastButton!.frame.maxY + itemSpace
            self.view.updateConstraints()
        }
        
    }
 @objc func itemButtonHandler(_ sender: UIButton) {
        let brand = self.brandButtonsArray[sender.tag]
        let viewController = CCProductListViewController(.brand(brand))
        self.navigationController?.pushViewController(viewController, animated: true)
    
    }

 

2017-03-21 18:16:37 jancywen 阅读数 356


map映射一个新数组

在这个例子中,“map”将第一个数组中的 element 转换为小写的字符串,然后计算他们的characters

let cast = ["Vivien", "Marlon", "Kim", "Karl"]
let lowercaseNames = cast.map { $0.lowercased() }
// 'lowercaseNames' == ["vivien", "marlon", "kim", "karl"]
let letterCounts = cast.map { $0.characters.count }
// 'letterCounts' == [6, 6, 3, 4]

API

	

    /// - Parameter transform: A mapping closure. `transform` accepts an

    ///   element of this sequence as its parameter and returns a transformed

    ///   value of the same or of a different type.

    /// - Returns: An array containing the transformed elements of this

    ///   sequence.

    public func map<T>(_ transform: (Element) throws -> T) rethrows -> [T]


filter 提取数组中满足条件的元素

在这个例子中,“filter”用于只包括短于5个字符的名称。

	let cast = ["Vivien", "Marlon", "Kim", "Karl"]
        let shortNames = cast.filter { $0.characters.count < 5 }
        print(shortNames)
        // Prints "["Kim", "Karl"]"

API

    /// - Parameter shouldInclude: A closure that takes an element of the
    ///   sequence as its argument and returns a Boolean value indicating
    ///   whether the element should be included in the returned array.
    /// - Returns: An array of the elements that `includeElement` allowed.
    public func filter(_ isIncluded: (Element) throws -> Bool) rethrows -> [Element]

reduce 将数组元素组合计算为一个值。这个例子展示了如何寻找一组数字的总和。

let numbers = [1, 2, 3, 4]
let addTwo: (Int, Int) -> Int = { x, y in x + y }
let numberSum = numbers.reduce(0, addTwo)
// 'numberSum' == 10
        
let sum =  numbers.reduce(0) { (sum, x) -> Int in
      sum + x
   }
// 'sum' == 10

//可以写成下面形式

sum = numbers.reduce(0,{$0 + $1})

sum = numbers.reduce(0,+)

API

    /// - Parameters:
    ///   - initialResult: the initial accumulating value.
    ///   - nextPartialResult: A closure that combines an accumulating
    ///     value and an element of the sequence into a new accumulating
    ///     value, to be used in the next call of the
    ///     `nextPartialResult` closure or returned to the caller.
    /// - Returns: The final accumulated value.
    public func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result