4.0 for swift_openstack swift 2.20.0 2.21.0 - CSDN
  • OC中的for循环写法:for (int i = 0;i < 100;i++) { NSLog(@"i=%zd",i); }Swift中的for循环写法:let a = 100; for i in 0 ..< a { print("a=\(i)"); }Swiftfor循环不需要i...

    OC中的for循环写法:

    for (int i = 0;i < 100;i++) {
            NSLog(@"i=%zd",i);
        }

    Swift中的for循环写法:

    let a = 100;
    for i in 0 ..< a {
        print("a=\(i)");
    }

    Swift中for循环不需要i的写法:

    let a = 100;
    for _ in 0..<a {
        print("a=\(a)");
    }

    展开全文
  • Swift4.0】属性

    2017-12-28 15:19:36
    希望对Swift的学习者有所帮助,使用的编写工具:JQNote  InNote(iPhone) 属性是把值和某个类,结构体或者枚举联系在一起。存储型属性存储一个实例的常量和变量值部分,然而计算型属性会计算出(而不是...

    翻译能力有限,如有不对的地方,还请见谅!希望对Swift的学习者有所帮助,使用的编写工具:JQNote    InNote(iPhone)


    属性是把值和某个类,结构体或者枚举联系在一起。存储型属性存储一个实例的常量和变量值部分,然而计算型属性会计算出(而不是存储)一个值。类,结构体和枚举都支持计算型属性,而存储型属性只有类和结构体支持。这两种属性通常跟某个类型的实例关联。然而,属性也可以跟类型本身关联起来,这种属性称之为类型属性。另外,你可以定义一个属性观察者来检测该属性值的改变。


    存储属性

    一个存储属性是一个常量或者变量,被存储作为一个类或者结构体实例的一部分。你可以在定义它的时候给它一个缺省值,也可以在初始化方法中设置和修改存储属性的初始化值,即便是该存储属性是常量。如果你创建了一个常量结构体实例,那么就不能修改该实例的属性,即使属性被声明为变量。


    let rangeOfFourItems = FixedLengthRange(firstValue: 0, length: 4)

    // this range represents integer values 0, 1, 2, and 3

    rangeOfFourItems.firstValue = 6

    // this will report an error, even though firstValue is a variable property”


    因为结构体是值类型,当一个结构体实例被声明为常量,那么它的所有属性都不能被改变。但是对于类来说,是引用类型,如果类实例被声明为常量,你还可以改变它的变量属性的。


    懒存储属性

    这种属性直到它第一次被使用才会初始化。在声明存储属性前面加上lazy关键字就表示为懒存储属性。


    你必须总是声明懒存储属性为变量(var),因为直到实例初始化完成之后,它的初始化值可能不能被获取,而常量属性必须总是在实例初始化完成之前有一个值。


    class DataImporter {

        /*DataImporter is a class to import data from an external ”

    “file.

         The class is assumed to take a non-trivial amount of time to initialize.

         */


        var filename = "data.txt"

        // the DataImporter class would provide data importing functionality here

    }

     

    class DataManager {

        lazy var importer = DataImporter()

        var data = [String]()

        // the DataManager class would provide data management functionality here

    }

     

    let manager = DataManager()

    manager.data.append("Some data")

    manager.data.append("Some more data")”


    如上面的例子,因为importer 被声明为一个lazy 属性,DataImporter实例仅仅是当 importer属性第一次被调用获取的时候,才会创建。

    print(manager.importer.filename)

    // the DataImporter instance for the importer property has now been created

    // Prints "data.txt”


    计算型属性

    计算型属性实际上不会存储一个值,相反,它们提供了一个getter和一个可选的setter方法来直接获取或者设置其它属性的值。

    struct Point {

        var x = 0.0, y = 0.0

    }


    struct Size {

        var width = 0.0, height = 0.0

    }


    struct Rect {

        var origin = Point()

        var size = Size()

        var center: Point {

            get {

                let centerX = origin.x + (size.width / 2)

                let centerY = origin.y + (size.height / 2)

                return Point(x: centerX, y: centerY)

            }

            set(newCenter) {

                origin.x = newCenter.x - (size.width / 2)

                origin.y = newCenter.y - (size.height / 2)

            }

        }

    }


    var square = Rect(origin: Point(x: 0.0, y: 0.0),

                      size: Size(width: 10.0, height: 10.0))

    let initialSquareCenter = square.center

    square.center = Point(x: 15.0, y: 15.0)


    只读的计算型属性

    一个计算型的属性,如果只有getter方法,没有setter方法,那就被认为是一个只读的计算属性。你可以声明一个简单的只读计算属性,不需要get关键字:

    struct Cuboid {

        var width = 0.0, height = 0.0, depth = 0.0

        var volume: Double {

            return width * height * depth

        }

    }


    let fourByFiveByTwo = Cuboid(width: 4.0, height: 5.0, depth: 2.0)

    print("the volume of fourByFiveByTwo is \(fourByFiveByTwo.volume)")

    // Prints "the volume of fourByFiveByTwo is 40.0”


    属性观察者

    属性观察者观察和响应一个属性值的改变。当属性值每次被set的时候,观察者都会被调用,即使新的值和当前的值相同。除了lazy属性,你可以将属性观察者添加到任何存储属性:


    >> willSet :值被存储之前调用

    >> didSet :新值被存储之后调用


    当你实现了willSet,它会传递一个新的值作为一个常量参数。你也可以给这个参数特定一个名字。如果你没有写这个参数名,那么默认newValue可以被使用。类似,如果实现了didSet,你也可以特定一个参数名或者使用默认的oldValue。

    class StepCounter {

        var totalSteps: Int = 0 {

            willSet(newTotalSteps) {

                print("About to set totalSteps to \(newTotalSteps)")

            }

            didSet {

                if totalSteps > oldValue  {

                    print("Added \(totalSteps - oldValue) steps")

                }

            }

        }

    }


    类型属性

    实例属性属于某个类型的实例,每次在创建实例的时候,它有自己的一系列属性。与其它实例是分开的。

    你也可以定义属于类型自己的属性,而不属于每个该类型的实例。类型属性只会拷贝一次,无论该类型被创建了多少个实例。

    不像存储实例属性,存储类型属性必须赋一个缺省值,这是因为类型自己没有一个初始化器可以在初始化的时候给类型属性设置值。

    定义一个类型属性,使用staic关键字:

    struct SomeStructure {

        static var storedTypeProperty = "Some value."

        static var computedTypeProperty: Int {

            return 1

        }

    }

    enum SomeEnumeration {

        static var storedTypeProperty = "Some value."

        static var computedTypeProperty: Int {

            return 6

        }

    }

    class SomeClass {

        static var storedTypeProperty = "Some value."

        static var computedTypeProperty: Int {

            return 27

        }

        class var overrideableComputedTypeProperty: Int {

             return 107

        }

    }


    获取和设置类型属性:

    print(SomeStructure.storedTypeProperty)

    // Prints "Some value."

    SomeStructure.storedTypeProperty = "Another value."

    print(SomeStructure.storedTypeProperty)

    // Prints "Another value."

    print(SomeEnumeration.computedTypeProperty)

    // Prints "6"

    print(SomeClass.computedTypeProperty)

    // Prints "27”



    展开全文
  • //// ViewController.swift// 014-UICollectionView//// Created by 庄壮勇 on 2018/1/4.// Copyright © 2018年 Personal. All rights reserved.//import UIKitclass ViewController: ...
    //
    //  ViewController.swift
    //  014-UICollectionView
    //
    //  Created by 庄壮勇 on 2018/1/4.
    //  Copyright © 2018年 Personal. All rights reserved.
    //

    import UIKit

    class ViewController: UICollectionViewController {
        // 数据源方法
        // 如果是使用 collectionViewController 数据源方法都有一个 ‘override’
        override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
            return 50
        }

        override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellId", for: indexPath)
           
            cell.backgroundColor = UIColor.init(red: CGFloat(arc4random()%256)/255.0, green: CGFloat(arc4random()%256)/255.0, blue: CGFloat(arc4random()%256)/255.0, alpha: 1)
           
            return cell
        }
       
        // 移动cell
        override func collectionView(_ collectionView: UICollectionView, moveItemAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
        }
    }
    展开全文
  • The Swift Programming Language 4.0 中文版学习笔记 11. 基础部分注释嵌套注释: /* A /* B */ /常量和变量常量和变量名可以使用Unicode字符来命名,但不能包含数学符号,箭头,保留的(或者非法的)Unicode码位...

    The Swift Programming Language 4.0 中文版学习笔记 1

    1. 基础部分

    注释

    嵌套注释:
    /* A
    /* B */
    /

    常量和变量

    常量和变量名可以使用Unicode字符来命名,但不能包含数学符号,箭头,保留的(或者非法的)Unicode码位,连线与制表符。也不能以数字开头。

    常量和变量一旦声明为确定的类型,即不能改变其存储的值的类型。同时,常量和变量不能互转。

    数字

    除非需要特定长度的整数,一般来说使用Int就够了,这样可以提供代码一致性和可复用性。

    尽量不要使用UInt,除非需要存储一个和当前平台原生字长相同的无符号整数。否则,最好使用Int,即使要存储的值已知是非负的。统一使用Int可以提高代码的可复用性,避免不同类型数字之间的转换,并且匹配数字的类型推断。

    Double类型的精确度高于Float,选择哪个类型取决于代码需要处理的值的范围,在两种类型都匹配的情况下,优先选择Double

    类型推断

    数字类字面量可由编译器推断类型,而数字类常量和变量必须显式转换为其他类型。

    类型别名

    类型别名typealias就是给现有类型定义另一个名字。

    元组

    可以把任何顺序的类型组合成一个元组,这个元组可以包含所有类型。

    可以将一个元组的内容分解为单独的常量和变量。如果只需要一部分元组值,分解的时候可以把要忽略的部分用下划线(_)标记。

    定义元组的时候,可以给单个元素命名。

    let http200Status = (statusCode: 200, description: “OK")
    print(“status code: \(http200Status.statusCode), description: \(http200Status.1)”)
    let (justTheStatusCode, _) = http200Status

    可选类型

    可选类型可以暗示任意类型的值缺失,并不需要一个如Objective-C中的NSNotFound这样的特殊值来标记非对象类型。

    可以给可选变量赋值为nil来表示它没有值,nil不能用于非可选的常量和变量。

    Swift的nil和Objective-C的nil并不一样。后者是一个指向不存在对象的指针。在Swift中,nil不是指针——它是一个确定的值,用来表示值缺失。

    可选绑定

    使用可选绑定(optional binding)来判断可选类型是否包含值,如果包含值就把值赋值给一个临时常量/变量。可选绑定可以用在ifwhile语句中。

    注意:在if条件语句中使用常量/变量来创建一个可选绑定,仅在if语句的句中(body)中才能获取到值。相反,在guard语句中使用常量/变量来创建一个可选绑定,仅在guard语句外且在语句后才能获取到值。

    隐式解析可选类型

    有时在程序架构中,第一次赋值之后可以确定一个可选类型总会有值。这种情况下,每次都要判断和解析可选类型是非常低效的。这种类型的可选状态被定义为隐式解析可选类型(implicitly unwrapped optionals)。把想要用做可选类型的后面的问号(String?)改为感叹号(String!)来声明一个隐式解析可选类型。

    注意:只在确定一个变量不可能变为nil时才使用隐式解析可选类型。否则在隐式解析可选类型没有值的时候尝试取值,会触发运行时错误;正如和没有值的普通可选类型后面加一个惊叹号一样。

    2. 基本运算

    空合运算符(Nil Coalescing Operator)

    空合运算符(a ?? b)将对可选类型a进行空判断,如果包含一个值就进行解封,否则就返回一个默认值b。注意这里,a 必须是可选类型, 默认值b的类型必须与a存储值的类型保持一致。

    区间运算符(Range Operators)

    a…b // 闭区间运算符
    a..<b // 半开区间运算符
    array[2…] // 单侧区间1
    array[…2] // 单侧区间2

    3. 字符串和字符

    多行字符串字面量

    由一对三个双引号"""包裹着文本,可实现跨越多行的字符串。注意:从开启引号当前行之后的第一行开始,到关闭引号当前行之前的一行为止。可以在行尾写一个反斜杠(\)作为续行符来实现增强代码可读性且避免换行。

    关闭引号当前行之前的空白字符串告诉Swift编译器其他各行多少空白字符串需要忽略。

    字符串是值类型

    Swift的String是值类型。拷贝的方式保证了在函数/方法中传递的是字符串的值。

    连接字符串和字符

    字符串支持的运算符包括+ += == !=,也可以使用append()方法将一个字符附加到一个字符串变量的尾部。

    字符串插值

    字符串插值是构建新字符串的方式之一,可以包含常量、变量、字面量和表达式。

    4. 集合类型(Collection Types)

    Swift语言提供Array(有序数据集合)、Set(无序不重复数据集合)、 Dictionary(无序键值对集合)三种基本集合类型用来存储集合数据。它们存储的数据类型必须明确。

    集合的可变性

    如果集合赋值给一个变量,则这个集合是可变的;否则分配给一个常量,则是不可变的。

    数组(Array)

    数组Array支持使用加法运算符+和加法赋值运算符+=[]是空数组。

    注意:自定义类型通过实现Hashable协议,可以作为集合的值的类型或者是字典的键的类型。实现Hashable协议,需要提供一个类型为Int的可读属性hashValue

    集合(Set)

    你可以高效地完成Set的一些基本操作,比如把两个集合组合到一起,判断两个集合共有元素,或者判断两个集合是否全包含,部分包含或者不相交。

    字典(Dictionary)

    通过访问keys或者values属性,我们也可以遍历字典的键或者值。

    5. 控制流

    Swift提供了多种流程控制结构,包括可以多次执行任务的while/(repeat-while)循环,基于特定条件选择执行不同代码分支的if、guard和switch语句,还有控制流程跳转到其他代码位置的break和continue语句。
    Swift 还提供了for-in循环,用来更简单地遍历数组(Array),字典(Dictionary),区间(Range),字符串(String)和其他序列类型。
    Swift 的switch语句比 C 语言中更加强大。case 还可以匹配很多不同的模式,包括范围匹配,元组(tuple)和特定类型匹配。switch语句的 case 中匹配的值可以声明为临时常量或变量,在 case 作用域内使用,也可以配合where来描述更复杂的匹配条件。

    Switch

    区间匹配

    case 分支的模式也可以是一个值的区间。

    元组

    我们可以使用元组在同一个switch语句中测试多个值。元组中的元素可以是值,也可以是区间。另外,使用下划线(_)来匹配所有可能的值。

    值绑定(Value Bindings)

    case 分支允许将匹配的值声明为临时常量或变量,并且在case分支体内使用 —— 这种行为被称为值绑定(value binding)。

    case 分支的模式可以使用where语句来判断额外的条件。

    复合匹配

    当多个条件可以使用同一种方法来处理时,可以将这几种可能放在同一个case后面,并且用逗号隔开。

    控制转移语句

    控制转移语句改变代码的执行顺序,通过它可以实现代码的跳转。

    Swift有五种控制转移语句:

    • continue
    • break
    • fallthrough
    • return
    • throw

    在 Swift 里,switch语句不会从上一个 case 分支跳转到下一个 case 分支中。

    相比之下,C 语言要求你显式地插入break语句到每个 case 分支的末尾来阻止自动落入到下一个 case 分支中。

    如果你确实需要 C 风格的贯穿的特性,你可以在每个需要该特性的 case 分支中使用fallthrough关键字。

    可以使用标签(statement label)来标记一个循环体或者条件语句,对于一个条件语句,你可以使用break加标签的方式,来结束这个被标记的语句。对于一个循环语句,你可以使用break或者continue加标签,来结束或者继续这条被标记语句的执行。

    例如,针对循环体的标签:

    label name: while condition { statements }

    提前退出

    if语句一样,guard的执行取决于一个表达式的布尔值。我们可以使用guard语句来要求条件必须为真时,以执行guard语句后的代码。不同于if语句,一个guard语句总是有一个else从句,如果条件不为真则执行else从句中的代码。

    guard let/var condition else {
        return // break/continue/throw/fatalError()
    }

    相比于可以实现同样功能的if语句,按需使用guard语句会提升我们代码的可读性。它可以使你的代码连贯的被执行而不需要将它包在else块中,它可以使你在紧邻条件判断的地方,处理违规的情况。

    检测API可用性

    if #available(platform name version, ..., *) {
        APIs 可用,语句将执行
    } else {
        APIs 不可用,语句将不执行
    }

    6. 函数(Functions)


    1. The Swift Programming Language http://wiki.jikexueyuan.com/project/swift/
    展开全文
  • 1.在ios开发中,数组经常用到,今天我们就来说说数组// 1.定义一个不可变数组 let arrayC = [1,2,3] // 2....// 2.1 定义一个任意类型的数组 //var arrayM = Array&lt;T&...var arrayM2 = [3,...
  • guard是Swift新增语法. guard语句必须带有else语句当条件表达式为true时候跳过else语句中的内容,执行语句组内容;条件表达式为false时候执行else语句中的内容,跳转语句一般是return、break、continue和throw guard ...
  • Swift 4 在 Swift 3 的基础上,提供了更强大的稳健性和稳定性,为 Swift 3 提供源码兼容性,对标准库进行改进,并添加了归档和序列化等功能。 你可以通过观看 WWDC 2017: What’s New in Swift 或完整发行说明...
  • Swift4.0 study1 语法

    2018-01-19 10:29:45
    swift学习第一天 :语法 1.常量和变量 var 修饰变量 (可以修改) let 修饰常量(不可变) print代理oc中的NSLog输出 2.数据类型转换:Swift是强语言(OC是弱语言)故进行转换时必须指明数据类型,即...
  • swift4.0 适配

    2019-02-20 00:10:44
    一、前言在我们的工程中处于swift和OC混编的状态,使用swift已经有一年半的时间了,随着Xcode9的更新,swift3.2和swift4.0也随之到来,swift3.2相较于Xcode8的swift3.1变动极小,适配没遇到问题,主要关注swift4.0的...
  • //// ViewController.swift// 007-加法计算器//// Created by 庄壮勇 on 2018/1/8.// Copyright © 2018年 Personal. All rights reserved.//import UIKitclass ViewController: UIViewController { var ...
  • coreBluetooth4.0(swift)

    2015-07-09 15:49:50
    看过一些蓝牙App的事例,大体上对蓝牙的连接过程...这里所说的蓝牙是针对 bluetooth 4.0的。  第一步就是去看官方的关于蓝牙框架的文档,即Core Bluetooth Programming Guide,在苹果的官方网站上可以轻松找到,不管
  • 注:文章转自这里 1.Unicode 字符串在计算 count 时的正确性改善 在 Unicode 中,有些字符是由几个其它字符组成的,比如 é 这个字符,它可以用 \u{E9} 来表示,也可以用 e 字符和上面一撇字符组合在一起表示 \u...
  • //// ViewController.swift// 011-数组//// Created by 庄壮勇 on 2018/1/3.// Copyright © 2018年 Personal. All rights reserved.//import UIKitclass ViewController: UIViewController { override func ...
  • import UIKit class MainViewController: UITabBarController { //MARK:属性 懒加载 lazy var composeBtn = UIButton(composeForeImageName: "tabbar_compose_icon_add", composeBackImageName: "tabbar_co
  • override func viewDidLoad() { super.viewDidLoad() //写一个按钮 btn.frame.size = CGSize(width: 100, height: 50) btn.center = view.center btn.backgroundColor = .red ...
  • Swift 4.0学习之:闭包

    2018-03-14 09:56:51
    闭包 说到闭包,用法跟OC的block是一样一样的,基本格式是 { ()-&gt;() in } 通常是放到函数的实参里,举一个实际应用的例子: ...目标:创建一个scrollorView,上面有10个按钮,要求有一定的可复用性,可维护...
  • //// ViewController.swift// 013-tableView//// Created by 庄壮勇 on 2018/1/4.// Copyright © 2018年 Personal. All rights reserved.//import UIKitclass ViewController: UIViewController,...
  • Swift4.0入门视频教程,课程内容包含Swift入门知识、数据类型(元组、Dictionary、运算符)、流程控制、函数、类与对象、扩展协议、常见概念、实用进阶、案例实战。 1、119节大容量课程:包含了Swift4.0语言大部分...
  • CmdBluetooth ... CmdBluetooth是一个针对于iOS的轻量级可扩展框架,Core内部将蓝牙周边抽象化,用户无需关注蓝牙内的操作细节与流程,仅需要你们自己的蓝牙协议,创造出自己的命令对象。 以往的蓝牙协议都是集中式...
  • ViewController.swift import UIKit /* 在swift中 所有的类和类的方法 都是共享的 在同一个命名空间 所有的类都是共享的 命名空间 是项目名称 */ class ViewController: UIViewController { override func ...
1 2 3 4 5 ... 20
收藏数 3,012
精华内容 1,204
关键字:

4.0 for swift