摘要 过年不能闲着,一边学习Swift,一边写笔记,相信在有一定其他语言基础的情况下用1.5小时看完该文章即可掌握。然后再花30分钟打开XCode写个Demo. 生命中拿出2小时来认识一门语言,很值吧!

目录[-]

  • swift基础知识
  • 变量和常量
  • 元组
  • 数组
  • 字典
  • 控制流
  • if
  • for-in
  • while
  • if-let
  • 函数
  • 单返回值简单函数
  • 使用元组多返回值
  • 外部名称调用
  • 将函数用作变量
  • 闭包closure
  • 对象
  • 定义
  • 使用
  • 继承
  • 初始化与反初始化
  • 协议
  • 扩展
  • 访问控制
  • 运算符重载
  • 泛型
  • 字符串
  • 数据
  • Swift with cocoa用Xcode开发软件
  • STEP1
  • STEP2
  • STEP3
  • STEP4
  • STEP5
  • STEP6
  • 过年不能闲着,一边学习Swift,一边写笔记,相信在有一定其他语言基础的情况下用1.5小时看完该文章即可掌握。然后再花30分钟打开XCode写个Demo.
    生命中拿出2小时来认识一门语言,很值吧!
    笔记共分为两部分,一Swift基础知识,二使用Xcode开发一个软件
    [TOC]

    swift基础知识

    变量和常量

    //定义变量
    var myVariable = 123
    
    //定义常量
    let myConstantvariable = 123
    
    // 隐式指定整数类型
    var anInteger = 2
    
    // 明确指定整数类型
    let anExplicitInteger :Int = 2

    元组

    let aTuple = (1,"Yes")
    let anotherTuple = (aNumber: "Yes")
    let theOtherNumber = anotherTuple.aNumber  // = 1

    其他用法

    let http404Error = (404,"Not Found")
    let (statusCode,statusMessage) = http404Error
    print("The status code is \(statusCode)")

    更多用户函数返回值,返回两个以上的值,跟golang很像

    数组

    var arrayOfIntegers : [Int] = [2,255)">3]
    // 隐式指定
    var implicitArrayOfIntegers = [3]
    
    // 也可以创建空数组,但必须提供其类型
    let anotherArray = [Int]()
    
    //使用 append 函数向数组的末尾追加对象
    myArray.append(4)
    
    //数组中的任意位置插入对象
    myArray.insert(5,atIndex: 0)

    字典

    字典是一种将键映射到值的类型,类似Java的Map,PHP的数组

    var crew = [
              "Caption": "Jean-Luc Picard","First officer": "William Riker","Second Officer": "Data"
    ];
    
    
    crew["Captain"]
    // = "Jean-Luc Picard"

    控制流

    if

    if 1+1 == 2 {
             println("The math checks out")
    }

    for-in

    let loopingArray = [3,255)">4,255)">5]
    var loopSum = 0
    for number in loopingArray {
         loopSum += number
    }
    loopSum // = 15
    var firstCounter = 0
         for index in 1 ..< 10 {
             firstCounter++
         }
    // 循环9次
    
    var secondCounter = 0
    for index in 1 ... 10 { // 注意是三个句点,不是两个
             secondCounter++
         }
    // 循环10次
    
    var sum = 0
    for var i = 0; i < 3; i++ {
        sum += 1 
    }
    sum // = 3

    while

    var countDown = 5
    while countDown > 0 {
         countDown--
    }
    countDown // = 0
    var countUP = 0
    do {
             countUp++
    } while countUp < 5
    countUp // = 5

    if-let

    可以用 if-let 语句检查一个可选变量是否包 含值。如果包含,则将这个值指定给一个常量变量,然后运行某段代码。这样可以减少很 多行代码,同时又能够保证安全性

    var conditionalString : String? = "a string"
         if let theString = conditionalString? {
             println("The string is '\(theString)'")
         } else {
             println("The string is nil")
    }
    // 输出 "The string is 'a string'"

    函数

    单返回值简单函数

    两个参数一个返回值,都为Int

    func thirdFunction(firstValue: Int,secondValue: Int) -> Int {
             return firstValue + secondValue
         }
    thirdFunction(2)

    使用元组多返回值

    fourthFunction(firstValue: Int,secondValue: Int) -> (doubled: Int,quadrupled: Int) {
             return (firstValue * 4)
         }
    fourthFunction(4)
    
    // 用数字访问:
    fourthFunction(4).1 // = 16
    
    // 其他相同,只是使用了名字:
    fourthFunction(4).quadrupled // = 16

    外部名称调用

    在定义函数时,可以为参数指定名字。当无法马上明白每个参数的用途时,这一功能会非 常有用。可以像下面这样来定义参数名字:

    addNumbers(firstNumber num1 : Int,toSecondNumber num2: Int) -> Int {
             return num1 + num2
    }
    addNumbers(firstNumber: 3)  // = 5

    在为参数创建名字时,就是为参数创建一个内部名字和一个外部名字,一个参数的内部名字应当与外部名字相同。将同一个名字输 入两次也没有什么问题,但的确有一种简便的方式来定义一个外部名字与内部名字相同的 参数——就是在参数名之前放一个 # 符号

    multiplyNumbers(#firstNumber: Int,#multiplier: Int) -> Int {
             return firstNumber * multiplier
    }
    multiplyNumbers(firstNumber: 3)  // = 6

    将函数用作变量

    var numbersFunc: (Int,Int) -> Int;
    // numbersFunc现在可以存储任何接受两个Int并返回一个Int的函数
    
    numbersFunc = addNumbers
    numbersFunc(3) // = 5

    闭包closure

    sort需要传递一个闭包作为参数

    var numbers = [34,255)">6,255)">33,255)">67,255)">20]
    var numbeRSSorted = numbers.sort( { (first,second ) -> Bool in
        
        return first < second
    })

    闭包只包含一行代码,可以省略 return 关键字

    var numbeRSSorted = numbers.sort( { $1 > $0})
    print(numbeRSSorted)

    如果一个闭包是函数调用中的最后一个参数,可以将它放在括号外面。这纯粹是为 了提高可读性,不会改变闭包的工作方式

    var numbeRSSorted = numbers.sort(){ $0}
    print(numbeRSSorted)

    闭包放在变量里面

    var comparator = {(a: Int,b: Int) in a < b}
    comparator(2)  // = true

    对象

    定义

    class Vehicle {
        var color: String?
        var maxSpeed = 80
        func description() -> String {
            return "A \(self.color) vehicle"
        }
        func travel() {
            print("Traveling at \(maxSpeed) kph")
        }
    }

    使用

    var redVehicle = Vehicle()
    redVehicle.color = "Red"
    redVehicle.maxSpeed = 90
    redVehicle.travel() // 输出"Traveling at 90 kph" redVehicle.description() // = "A Red vehicle"

    继承

    要重写一个函数,要在子类中重新声明它,并添加 override 关键字

    Car: Vehicle {
    // 继承类可以重写函数
                 override func String {
                     var description = super.description()
                     return description + ",which is a car"
    } }

    在一个被重写的函数中,可以通过 super 回调该函数在父类中的版本

    override func String {
             var description = super.description()
             return description + ",which is a car"
    }

    初始化与反初始化

    InitAndDeinitExample {
        // 指定的初始化器(也就是主初始化器)
        init() {
            print("I've been created!")
        }
        // 便捷初始化器,是调用上述指定初始化器所必需的
        convenience init (text: String) {
            self.init() // 这是必需的
            print("I was called with the convenience initializer!")
        }
        // 反初始化器
        deinit {
            print("I'm going away!")
        }
    }
    
    var example : InitAndDeinitExample?
    // 使用指定的初始化器
    example = InitAndDeinitExample() // 输出"I've been created!"
    example = nil // 输出"I'm going away"
    // 使用便捷初始化器
    example = InitAndDeinitExample(text: "Hello")
    // 输出"I've been created!"
    // 然后输出"I was called with the convenience initializer"

    创建一个可以返回 nil 的初始化器(也称为可以失败的初始化器),就在 init 关键字的后面放上一个问号,并在初始化器确定它不能成功地构造该对象时,使用 return nil:

    convenience init? (value: Int) {
        self.init()
        if value > 5 {
            // 不能初始化这个对象;返回nil,表示初始化失败 return nil
        } }

    在使用一个可以失败的初始化器时,任何可以在其中存储该结果的变量都是可选的:

    let failableExample = InitAndDeinitExample(value: 6)
    // = nil

    协议

    使用协议的好处是,可以利用 Swift 的类型体系来引用任何遵守某一给定协议的对象,个人现在理解为是Interface概念。

    protocol Blinking{
        var isBlinking:Bool{get}
        var blinkSpeed: Double { get set }
        func startBlinking(blinkSpeed: Double) -> Void } class Light:Blinking{
        var isBlinking = false
        var blinkSpeed = 1.2
        func startBlinking(blinkSpeed: Double) {
                print("Now my speed is \(self.blinkSpeed)")
        }
        
    }

    扩展

    extension Int {
             var doubled : Int {
                 return self * 2
             }
             func multiplyWith(anotherNumber: Int) -> Int {
                 return self * anotherNumber
    } }
    
    2.doubled  // = 4
    4.multiplyWith(32) // = 128

    还可以利用扩展使一个类型遵守一个协议

    Int : Blinking {
        var isBlinking : Bool {
            return false;
        }
        var blinkSpeed : Double {
            get {
                return 0.0; }
            set {
                // 不做任何事情
            } }
        func startBlinking(blinkSpeed : Double) {
            print("I am the integer \(self). I do not blink.")
        } }
    2.isBlinking // = false
    2.startBlinking(2.0) // 输出"I am the integer 2. I do not blink."

    访问控制

    在将一个方法或属性声明为 public 时,App 中的所有人都能看到它:

    // 可供所有人访问
    public var publicProperty = 123
    
    //如果将一个方法或属性声明为 private,那只能在声明它的源文件内部看到它:
    // 只能在这个源文件中访问
    private var privateProperty = 123
    
    // 仅能供本模块访问
    // 这里的'internal'是默认的,可以省略 
    internal var internalProperty = 123

    运算符重载

    类似C++的运算符重载

    Vector2D {
        var x : Float = 0.0
        var y : Float = 0.0
        init (x : Float,y: Float) {
            self.x = x
            self.y = y
        }
       
    }
    func +(left : Vector2D,right: Vector2D) -> Vector2D {
        let result = Vector2D(x: left.x + right.x,y: left.y + right.y)
        return result
    }
    
    let first = Vector2D(x: 2)
    let second = Vector2D(x: 1)
    let result = first + second

    泛型

    Swift与Java泛型相同

    Tree <T> {
        // 'T'现在可以用作一种类型 var value : T
        var value:T
        var children : [Tree <T>] = []
        init(value : T) {
            self.value = value
        }
        func addChild(value : T) -> Tree <T> {
            var newChild = Tree<T>(value: value)
            children.append(newChild)
            reutrn newChild
        }
    }
    
    
    // 整数树
    let integerTree = Tree<Int>(value: 5)
    // 可以增加包含Int的子树 
    integerTree.addChild(10)
    //用Swift设计程序 | 45
    integerTree.addChild(5)
    // 字符串树
    let stringTree = Tree<String>(value: "Hello")
    stringTree.addChild("Yes")
    stringTree.addChild("Internets")

    字符串

    比较字符串

    let string1 : String = "Hello"
         let string2 : String = "Hel" + "lo"
         if string1 == string2 {
             println("The strings are equal")
      }

    查找字符串

    if string1.hasPrefix("H") {
             println("String begins with an H")
         }
         if string1.hasSuffix("llo") {
             println("String ends in 'llo'")
         }

    数据

    let stringToConvert = "Hello,Swift"
    let data = stringToConvert.dataUsingEncoding(NSUTF8StringEncoding)

    Swift with cocoa用Xcode开发软件

    打开Xcode 7.2

    STEP1

    打开Xcode新建Project选择OSX Application

    STEP2

    STEP3

    打开Main.storyboard,在ViewController中拖入Label

    STEP4

    修改ViewController.swift代码

    import Cocoa
    
    class ViewController: NSViewController {
    
        @IBOutlet weak var timestamp:NSTextField!
        @IBOutlet weak var dateLabel:NSTextField!
        @IBAction func calc(sender:NSButton){
            
            //将输入的字符串转为Nsstring
            let string = Nsstring(string: self.timestamp.stringValue)
            
            //转为double类型
            let ts:NSTimeInterval = string.doubleValue
            
            //转换日期
            let date = NSDate(timeIntervalSince1970: ts)
            
            //日期格式化
            let dfmatter = NSDateFormatter()
            dfmatter.dateFormat="yyyy年MM月dd日"
            
            //显示到Label
            dateLabel.stringValue = dfmatter.stringFromDate(date)
        }
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // Do any additional setup after loading the view.
        }
    
        override var representedobject: AnyObject? {
            didSet {
            // Update the view,if already loaded.
            }
        }
    
    
    }

    上述的NSTextField后面的叹号,它被称为隐式拆封的可选类型,是一种特殊类型,指出变量可能有值,也可能为nil。Swift运行 环境不喜欢访问值为nil的变量,因此Swift程序员必须知晓变量的值,尤其在其可能为nil时。
    将变量声明为隐式拆封的可选类型相当于告诉Swift编译器,你承诺在该变量的值为nil时绝 不会访问它。这是你与编译器签订的一个合约,你必须遵守。如果你不遵守,在变量为nil时访 问它,将引发运行阶段错误,导致应用程序停止运行

    另外也可以开启两个视图直接拖入例如:

    STEP5

    链接UI与代码部分,将TextField右键,选择new referencing Outlets点加号指向ViewController,在弹出的选项里面选择timestamp,同样方式选择到label上。

    绑定按钮的click事件

    STEP6

    点击上方的三角箭头运行程序




    FROM: http://my.oschina.net/mengshuai/blog/614396

    Swift笔记-让你2小时学会Swift的更多相关文章

    1. three.js模拟实现太阳系行星体系功能

      这篇文章主要介绍了three.js模拟实现太阳系行星体系功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

    2. HTML5页面无缝闪开的问题及解决方案

      这篇文章主要介绍了HTML5页面无缝闪开方案,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

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

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

    4. ios – Swift相当于`[NSDictionary initWithObjects:forKeys:]`

      Swift的原生字典是否与[NSDictionaryinitWithObjects:forKeys:]相当?假设我有两个带键和值的数组,并希望将它们放在字典中.在Objective-C中,我这样做:当然我可以通过两个数组迭代一个计数器,使用vardict:[String:Int]并逐步添加东西.但这似乎不是一个好的解决方案.使用zip和enumerate可能是同时迭代两者的更好方法.然而,这种方法

    5. ios – 如何从变量访问属性或方法?

      是否可以使用变量作为Swift中方法或属性的名称来访问方法或属性?在PHP中,您可以使用$object->{$variable}.例如编辑:这是我正在使用的实际代码:解决方法你可以做到,但不能使用“纯粹的”Swift.Swift的重点是防止这种危险的动态属性访问.你必须使用Cocoa的Key-ValueCoding功能:非常方便,它完全穿过你要穿过的字符串到属性名称的桥,但要注意:这里是龙.

    6. ios – Swift中的UIView动画不起作用,错误的参数错误

      我正在尝试制作动画并使用下面的代码.我得到“无法使用类型’的参数列表调用’animateWithDuration'(FloatLiteralConvertible,延迟:FloatLiteralConvertible,选项:UIViewAnimationoptions,动画:()–>()–>$T4,完成:(Bool)–>(Bool)–>$T5)’“错误.这意味着我使用了错误的参数.我错了.请

    7. ios – 无法识别的选择器发送到实例NSTimer Swift

      解决方法让updateTime成为一个类方法.如果它是在一个纯粹的Swift类中,你需要在@objc前面说明该方法的声明,如:

    8. iOS &gt;&gt;块&gt;&gt;更改块外部的变量值

      我不是在处理一个Object并改变它,就像我的mString一样.我希望’center’属性的行为类似于myInt,因为它是直接访问的C结构,而不是指向对象的指针.我希望’backgroundColor’的行为类似于我的imstring,因为它是一个指向一个新对象的对象的指针,不是吗?

    9. ios – Xcode Bot:如何在post触发器脚本上获得.ipa路径?

      我正在使用机器人来存档iOS应用程序,我需要获取.ipa产品路径才能将其发布到我们的分发系统中.机器人设置:并使用脚本打印所有env变量,其中不包含ipa文件的路径.此外,一些变量指向不存在的目录,即:XCS_OUTPUT_DIR这里的env变量输出:除此之外,我还能够确认.ipa文件是在另一个文件夹中创建的(/IntegrationAssets//

    10. ios – 类型不符合协议

      我仍然无法理解Swift中泛型的一些微妙之处.我定义了以下类型:viewForValue现在我定义了以下功能.我希望T是一个符合协议SomeProtocol的UIView.但是,当我执行代码时,我收到以下编译错误:似乎在where子句中我不能指定不实现协议的类.这是为什么?

    随机推荐

    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,所以编译器会报错,现在来一一解决。

    返回
    顶部