转载自:酷走天涯(文中部分错误已修改 如发现请告知)

基本数据类型

  • 使用 let 定义常量

let myConstant = 42

  • 使用var 定义变量
var myVariable = 42
myVariable = 50
  • 如果有初始化,你可以指定变量类型或者让系统自己去推断
let implicitInteger = 70
let implicitDouble = 70.0
let explicitDouble: Double = 70
  • 如果没有初始化,你要必须指定变量类型
var numb:Double
  • 在Swift 中,字符串是基本类型
let label = "The width is "
width = 94
  • 如何实现数据之间的相互转换
let 94
let widthLabel:String = String(width)
  • 使用最简单的方式将其他数据类型变成字符串
let apples = 3
let oranges = 5
let fruitSummary = "I have \(apples + oranges) pieces of fruit."
  • 数组也是基本类型,不再是OC中的引用类型了
var shoppingList = ["catfish","water",152)">"tulips",152)">"blue paint"]
shoppingList[1] = "bottle of water"
  • 定义一个空数组
let emptyArray = [String]()
 let emptyArray:[String] = []
  • 字典也是基本类型
var occupations = [
"Malcolm": "Captain",152)">"Kaylee": "Mechanic",]
  • 将数组清空
var shopingList1 = ["1",152)">"2"]
 shopingList1 = [] // 如果你这个类型,是系统可以推断的类型,你可以这样清空数组或者初始化
  • 定义一个空字典
let emptyDictionary = [String: Float]()
let emptyDictionary:[String: Float] = [:]
  • 清空字典
dictionary = [1:"2"]
dictionary = [:]

可选值

let nickName: String? = nil

"?" :你的变量可能为nil,或者你可能将nil赋值给它,需要给变量定义的时候加上"?",否则一旦你将nil赋值给没有加"?"的变量,编译就会报错。
举个例子理解一下,我们假如有一个盒子,盒子是一个存在的物体,Swift不允许有空值出现,那我们怎么办呢?就需要把空值装到一个盒子里面,系统检查的时候,发现有一个盒子,哦好的,检测通过,但是如果你把盒子打开系统就会报错。

运行下面的代码:

let nickName: String? = "酷走天涯"
print(nickName)

结果:

Optional("酷走天涯")

发现有个Optional 就说明这个变量被包着,那么怎么才能不让它包裹着呢? 很简单,给变量加一个"!"

print(nickName!)

运行:

酷走天涯


我们还有一种解包的方式

String? = nil
let fullName: String = "XUJIE"
let informalGreeting = "Hi \(nickName ?? fullName)"
print(informalGreeting)

运行
Hi XUJIE

如果第一个解包值发现为nil,则使用第二值

控制流

  • for ... in 循环
// 遍历数组
let individualscores = [75,43,152)">103,152)">87,152)">12]
var teamscore = 0
for score in individualscores {
  if score > 50 {
      teamscore += 3
} else {
    teamscore += 1
}
}
print(teamscore)
// 遍历 字典
let interestingNumbers = [
"Prime": [2,152)">3,152)">5,152)">7,152)">11,152)">13],152)">"Fibonacci": [1,152)">8],152)">"Square": [4,152)">9,152)">16,152)">25],]
var largest = for (kind,numbers) in interestingNumbers {
    for number in numbers {
        if number > largest {
            largest = number
        }
    }
 }
 // 还可以这样使用循环
  var total = 0
 for i in 0..<4 {
   total += i
 }
 print(total)
  • Switch
let vegetable = "red pepper"
switch vegetable {
case "celery":
    print("Add some raisins and make ants on a log.")
"cucumber",152)">"watercress":
    "That would make a good tea sandwich.")
case let z where z.hasSuffix("pepper"):
    "Is it a spicy \(z)?")
default:
    "Everything tastes good in soup.")
}

注意 z 什么 随便写个变量名就可以了

  • while 循环
var n = 2
  while n < 100 {
n = n * 2
}
print(n)
  • repeat ...while
var m = 2
  repeat {
  m = m * 2
} while m < 100
print(m)

函数和闭包

  • 定义函数
  • func greet(person: String,day: String) -> String {
    return "Hello \(person),today is \(day)."
    }
    greet(person: "Bob",210)">day: "Tuesday")
    • 缺省参数名
    func greet(_ person: String,152)">_ day: String) -> 
    }
    greet("John",152)">"Wednesday")
    • 返回值可以是元祖类型
    func calculateStatistics(scores: [Int]) -> (min: Int,210)">max: Int,210)">sum: Int) {
    min = scores[0]
    max = scores[sum = in scores {
        if score > max {
            max = score
        } else if score < min {
            min = score
        }
        sum += score
    }
    
    return (min,210)">max,210)">sum)
    }
    let statistics = calculateStatistics(scores: [100,152)">9])
    print(statistics.sum)
    print(statistics.2)
    • 定义多个类型相同的参数
    func sumOf(numbers: Int...) -> Int {
    var sum = in numbers {
        sum += number
    }
      return sum
    }
    sumOf()
    sumOf(numbers: 42,152)">597,152)">12)
    • 函数嵌套使用
    returnFifteen() -> Int {
    var y = 10
    add() {
        y += 5
    }
    // 方法内部定义方法,声明周期为方法
    add()
    return y
    }
    returnFifteen()
    • 函数当返回值
    func makeIncrementer() -> ((Int) -> Int) { func addOne(number: Int) -> Int {
            return 1 + number
    }
    return addOne
    }
    var increment = makeIncrementer()
    increment(7)
    • 函数当参数
    hasAnyMatches(list: [Int],condition: (Int) -> Bool) -> Bool {
    for item in list {
        if condition(item) {
            return true
        }
    }
    return false
    }
    lessthanTen(number: Int) -> Bool {
        return number < 10
    }
    var numbers = [20,152)">19,152)">12]
    hasAnyMatches(list: numbers,condition: lessthanTen)

    对象和类

    • 定义一个类
    class Shape {
    var numberOfSides = 0
    func simpleDescription() -> String {
        "A shape with \(numberOfSides) sides."
    }
    }
    • 初始化方法,和对象方法
    NamedShape {
        var numberOfSides: Int = 0
        var name: String
        // 初始化方法
        init(name: String) {
           self.name = name
        }
        // 成员方法定义
        simpleDescription() -> String {
           "A shape with \(numberOfSides) sides."
        }
    }
    • 继承
    Square: NamedShape {
      var sideLength: Double  // 如果不是可选类型 必须在初始化方法中初始化
    
      init(sideLength: Double,name: String) {
        self.sideLength = sideLength
        super.init(name: name) // 调用父类的初始化方法
        numberOfSides = 4 // 给父类的属性赋值之前必须先调用父类的初始化方法
      }
    
      area() ->  Double {
          return sideLength * sideLength
      }
    
        // 重写父类的方法
        override String {
            "A square with sides of length \(sideLength)."
        }
      }
    • setter 和 getter
    EquilateralTriangle: NamedShape {
    var sideLength: Double = 0.0  // 定一个属性
    init(sideLength: Double,name: String) {
        self.sideLength = sideLength
        super.init(name: name)
        numberOfSides = 3
    
    }
     // 这个是setter 和geterr方法的定义
      var perimeter: Double {
        get {
             3.0 * sideLength
        }
        set {
            sideLength = newValue / 3.0
        }
        }
    
    override func simpleDescription() -> String {
        "An equilateral triangle with sides of length \(sideLength)."
    }
    }
    • 观察属性
    class TriangleAndSquare {
      // 定一个三角形对象
      var triangle: EquilateralTriangle {
        willSet {
            square.sideLength = newValue.sideLength
        }
      }
      // 定一个一个正方形对象
      var square: Square {
        willSet {
            triangle.sideLength = newValue.sideLength
        }
      }
      // 通过检测属性,我们让两个对象的边保持一样长
      init(size: Double,name: String) {
        square = Square(sideLength: size,name: name)
        triangle = EquilateralTriangle(sideLength: size,name: name)
      }
      }
      var triangleAndSquare = TriangleAndSquare(size: 10,name: "another test shape")
      print(triangleAndSquare.square.sideLength)
      print(triangleAndSquare.triangle.sideLength)
      triangleAndSquare.square = Square(sideLength: 50,152)">"larger square")
      print(triangleAndSquare.triangle.sideLength)

    运行结果

    10.0
    10.0
    50.0

    枚举类型

    • 定义
    enum Rank: Int { // Int 设置枚举值的类型
    // 定义枚举值设置值
    case ace = 1
    // 可以case 后面一次定义多个枚举值
    case two,three,four,five,six,seven,eight,nine,ten
    case jack,queen,king
    
    // 定义函数 如果多人合作的时候,可以使用这个让别人更加了解你定义的属性的含义
    String {
        switch self { // self 就是这个枚举本身
            case .ace:
                "ace"
            case .jack:
                "jack"
            case .queen:
                "queen"
            case .king:
                "king"
            default:
                return String(self.rawValue)
        }
    }
    }
    // 使用
    let ace = Rank.ace
    let aceRawValue = ace.rawValue

    问题1 如何想OC 一样使用 | 或操作呢?

    结构体

      struct Card { // 定义结构体 var rank: Rank var suit: Suit // 结构体内可以定义方法 "The \(rank.simpleDescription()) of \(suit.simpleDescription())" } }
      • 使用
      let
      threeOfSpades = Card(rank: .three,suit: .spades) let threeOfSpadesDescription = threeOfSpades.simpleDescription()

      协议

        protocol ExampleProtocol { var simpleDescription: String { get } mutating adjust() }
        • 给类添加协议
    SimpleClass: ExampleProtocol {
     "A very simple class."
     var anotherProperty: 69105
     adjust() {
          simpleDescription += " Now 100% adjusted."
     }
    }
    • 给结构体添加协议
    SimpleStructure: "A simple structure"
     " (adjusted)"
     }
    }
    • 定义一个协议变量
    let protocolValue: ExampleProtocol = a
    print(protocolValue.simpleDescription)

    扩展

    例子:给Int 添加一个协议

    extension Int: ExampleProtocol {
    "The number \(self)"
    }
        adjust() {
            self += 42
        }
    }
    print(7.simpleDescription)

    错误操作

    • 定义一个错误枚举
    PrinterError: Error {
    case outOfPaper
    case noToner
    case onFire
    }
    • 定义一个有异常处理能力的函数
    send(job: Int,toPrinter printerName: String) throws -> if printerName == "Never Has Toner" {
        throw PrinterError.noToner
    }
    "Job sent"
    }
    • 捕捉异常
    do {
    let printerResponse = try send(job: 1040,toPrinter: "Bi Sheng")
    print(printerResponse)
    } catch {
    print(error)
    }
    • 异常分类处理
    1440,152)">"Gutenberg")
        catch PrinterError.onFire {
        print("I'll just put this over here,with the rest of the fire.")
    } catch let printerError as PrinterError {
        "Printer error: \(printerError).")
    } catch {
          print(error)
    }

    总结

    Swift 的基本语法已经了解完毕,但这只是些简单的东西,如果Swift只是这些东西,那我们就没有学习的必要了,Swift的灵活性,优秀的设计模式,从上面的内容体现不出来,我会在后面几篇文章中,阐述它的高级用法!

    Swift 3.0 (一)的更多相关文章

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

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

    2. HTML5 WebSocket实现点对点聊天的示例代码

      这篇文章主要介绍了HTML5 WebSocket实现点对点聊天的示例代码的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

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

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

    4. ios – 在Swift的UIView中找到UILabel

      我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

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

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

    6. ios – 在Swift中将输入字段字符串转换为Int

      所以我非常擅长制作APP广告Swift,我试图在文本字段中做一些非常简单的输入,取值,然后将它们用作Int进行某些计算.但是’vardistance’有些东西不正确它是导致错误的最后一行代码.它说致命错误:无法解开Optional.None解决方法在你的例子中,距离是一个Int?否则称为可选的Int..toInt()返回Int?因为从String到Int的转换可能失败.请参阅以下示例:

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

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

    8. 如何在iOS中检测文本(字符串)语言?

      例如,给定以下字符串:我想检测每个声明的字符串中使用的语言.让我们假设已实现函数的签名是:如果没有检测到语言,则返回可选字符串.因此,适当的结果将是:有一个简单的方法来实现它吗?

    9. xamarin – 崩溃在AccountStore.Create().保存(e.Account,“);

      在Xamarin.Forms示例TodoAwsAuth中https://developer.xamarin.com/guides/xamarin-forms/web-services/authentication/oauth/成功登录后,在aOnAuthenticationCompleted事件中,应用程序在尝试保存到Xamarin.Auth时崩溃错误说不能对钥匙串说期待着寻求帮助.解决方法看看你

    10. ios – 将视频分享到Facebook

      我正在编写一个简单的测试应用程序,用于将视频从iOS上传到Facebook.由于FacebookSDK的所有文档都在Objective-C中,因此我发现很难在线找到有关如何使用Swift执行此操作的示例/教程.到目前为止我有这个在我的UI上放置一个共享按钮,但它看起来已禁用,从我读到的这是因为没有内容设置,但我看不出这是怎么可能的.我的getVideoURL()函数返回一个NSURL,它肯定包含视

    随机推荐

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

    返回
    顶部