澳门威斯尼人平台登陆:Vue中es5和es6语法

by admin on 2019年10月2日

基本类型

前言

在开发开源项目中由于大量的使用到数组相关的操作,但是js原生的数组语法有时候使用起来不是那么的随心所欲,于是就自己封装了一个常用的数组操作工具类。

工具源码,小伙伴们直接拷贝源码或者将arrayExtension.js文件拖拽到工程即可

工具源码:https://github.com/guangqiang-liu/react-native-ArrayTool

/** 数组拓展工具类 **/

const ArrayTool = {

  /**
   * 往数组中添加元素,若数组中已有此元素,则删除重复元素,添加新的元素
   * @param array
   * @param item
   * @returns {*}
   */
   update: (array, item) => {
    if(!Array.isArray(array)) {
      return []
    }
    for (let i = 0; i < array.length; i++) {
      let value = array[i]
      if (item === value) {
        array.splice(i, 1)
      }
    }
    array.push(item)
    return array
  },

  /**
   * 往数组中添加元素,若数组中有则不再添加
   * @param array
   * @param item
   * @returns {*}
   */
   add: (array, item) => {
    if(!Array.isArray(array)) {
      return []
    }
    for(let i = 0; i < array.length; i++) {
      let value = array[i]
      if (item === value) {
        return array
      }
    }
    array.push(item)
    return array
  },

  /**
   * 往数组中追加元素,元素追加到数组栈底
   * @param array
   * @param item
   * @returns {*}
   */
   push: (array, item) => {
    if(!Array.isArray(array)) {
      return []
    }
    array.push(item)
    return array
  },

  /**
   * 往数组中追加元素,元素追加到数组栈顶
   * @param array
   * @param item
   * @returns {*}
   */
   unshift: (array, item) => {
    if(!Array.isArray(array)) {
      return []
    }
    array.unshift(item)
    return array
  },

  /**
   * 往数组的指定位置插入一个元素
   * @param array
   * @param location
   * @param item
   * @returns {*}
   * @private
   */
  _splice: (array, location, item) => {
    if(!Array.isArray(array)) {
      return []
    }
    array.splice(location, 0, item)
    return array
  },

  /**
   * 往数组中指定位置插入指定长度个数的元素
   * @param array
   * @param item
   * @param location
   * @returns {*}
   */
   splice_A: (array, location, length, item) => {
    if(!Array.isArray(array)) {
      return []
    }
    array.splice(location, length, item)
    return array
  },

  /**
   * 删除数组中指定元素
   * @param array
   * @param item
   * @returns {*}
   */
   remove: (array, item) => {
    if(!Array.isArray(array)) {
      return []
    }
    for(let i = 0; i < array.length; i++) {
      let value = array[i]
      if (item === value) {
        array.splice(i, 1)
      }
    }
    return array
  },

  /**
   * 删除数组中最后一个元素
   * @param array
   * @returns {*}
   */
   pop: (array) => {
    if(!Array.isArray(array)) {
      return []
    }
    array.pop()
    return array
  },

  /**
   * 删除数组中第一个元素
   * @param array
   * @returns {*}
   */
   shift: (array) => {
    if(!Array.isArray(array)) {
      return []
    }
    array.shift()
    return array
  },

  /**
   * 删除数组中指定位置,指定长度的元素
   * @param array
   * @param location
   * @param length
   * @returns {*}
   */
   splice_D: (array, location, length) => {
    if(!Array.isArray(array)) {
      return []
    }
    array.splice(location, length)
    return array
  },

  /**
   * 判断两个数组是否相等
   * @param arr1
   * @param arr2
   * @returns {boolean}
   */
   isEqual: (array1, array2) => {
    if(!(Array.isArray(array1) && Array.isArray(array2))) {
      return false
    }
    if(array1.length !== array2.length) {
      return false
    }
    for(let i = 0; i < array1.length; i++) {
      if (array1[i] !== array2[i]) {
        return false
      }
    }
    return true
  }
}

export {ArrayTool}

https://www.zhihu.com/question/37984203

RN中ES6部分语法

ES6也就是ES2015.也叫做Harmony.
是ECMAScript的第四个版本,JavaScript是ECMAScript的一种实现.
RN使用Babel将ES6转换成ES5兼容的javascript.
下面对RN中常用的ES6的语法做个总结.

  1. 变量二次声明无意义,除非在第二次声明的时候,也赋值
  2. 有一些保留字

福利时间

  • 作者React
    Native开源项目OneM地址(按照企业开发标准搭建框架设计开发):https://github.com/guangqiang-liu/OneM
    (欢迎小伙伴们 star)
  • 作者简书主页:包含50多篇RN开发相关的技术文章http://www.jianshu.com/u/023338566ca5
    (欢迎小伙伴们:多多关注多多点赞)
  • 作者React Native QQ技术交流群:620792950 欢迎小伙伴进群交流学习
  • 友情提示:在开发中有遇到RN相关的技术问题,欢迎小伙伴加入交流群(620792950),在群里提问、互相交流学习。交流群也定期更新最新的RN学习资料给大家,谢谢支持!

总结vue中常用的es6语法

    1、对象的写法
        es5中对象: {add:add,substrict:substrict}
        es6中对象: {add,substrict}

    2、在对象中的方法的写法
        es5中对象: {add:function(){},substrict:function(){}}
        es6中对象: {add(){},substrict(){}}

    3、对象的导出写法
     calc.js

     es5两种形式:
     1、module.exports = fucntion (){};
     2、exprots.add =  fucntion (){};

    es6中写法:
    1、export default{
        add(){}
    }
    2、export fucntion add(){} 相当于 将add方法当做一个属性挂在到exports对象


    4、对象的导入
    es5: var add  = require('./calc.js');
    es6:
    如果导出的是:export default{ add(){}}
    那么可以通过  import obj from './calc.js'

    如果导出的是:
// 写法一
    export fucntion add(){} 
    export fucntion substrict(){} 
    export const PI=3.14   
// 写法二
    var m = 1;
    export {m};
// 写法三
   var firstName = 'Michael';
   var lastName = 'Jackson';
   var year = 1958;
   export {firstName, lastName, year};

    那么可以通过按需加载 import {add,substrict,PI} from './calc.js'

    5、es6中的箭头函数的写法
    箭头的演变过程:
    //需求:利用函数实现倒序排列
    [2,1,3].sort(function(x,y){return y - x;});

    //用箭头函数实现 =>读 goes to
    [2,1,3].sort((x,y)=>{return y - x;});
    [2,1,3].sort((x,y)=> {x++;y++; y - x;});
    [2,1,3].forEach(x=> {console.log(x)});

Destructuring(析构)

将数据从object中导出的简写方式.
ES5中想要导出object中的内容,要按照如下编写.

var myObj = {a:1,b:2};
var a = myObj.a;
var b = myObj.b;

使用ES6的语法,可以按照下面的方式写

var {a,b} = {a:1,b:2};

简化了代码导出时所需要写的内容.

在RN中经常会在require中使用该语法.
使用require时,实际上就是将object进行导出.

//不使用析构方式导出View组件
var React = require('react-native');
var View = React.View;

//使用析构方式导出View组件
var {View} = require('reacrt-native');

澳门威斯尼人平台登陆 1

  • javascript保留字
  • 使用保留字报错类型:Uncaught SyntaxError: Unexpected token finally

import Modules

一般我们会使用CommonJS module 语法导出组件或js模块.
在RN中,使用require导入其他的module.并通过module.export将代码导出.

//使用CommonJS的语法实现
var OtherComponent = require('./other_component');
var MyComponent = React.createClass({
    ...
});
module.exports = MyComponent;
//使用ES6的moudle 语法实现
import OtherComponent = require('./other_component');
var MyComponent = React.createClass({
    ...
});
export default MyComponent
let restaurantLocation = let restaurantRange = 2.5// Pythagorean Theorem # $func distance(from source: (x: Int, y: Int), to target: (x: Int, y: Int))-> Double { let distanceX = Double(source.x - target.x) let distanceY = Double(source.y - target.y) return sqrt(distanceX * distanceX + distanceY * distanceY)}func isInDeliveryRange(location: (x: Int, y: Int)) -> Bool { let deliveryDistance = distance(from: location, to: restaurantLocation) return deliveryDistance < restaurantRange}
  1. while只有一条语句的时候可省略大括号
  2. 循环标签使用方式

函数缩写

//传统写法
render: function(){
    return <TEXT>Hi</TEXT>;
}

//ES6的缩写方式
render(){
    return <TEXT>Hi</TEXT>;
}

澳门威斯尼人平台登陆 2

  • 在需要跳出的for循环层添加label
  • continuebreak后添加同名label

Fat Arrow 方法

在js中,我们经常需要将函数绑定到指定的context.
澳门威斯尼人平台登陆 ,在ES6中可以使用fat arrow来自动对context进行绑定.

//ES5中实现函数绑定的方式
var callbackFunc = function(val){
    console.log('Do something');
}.bind(this);

//ES6中的fat arrow的方式实现
var callbackFunc = (val)=>{
    console.log('Do something');
}
let restaurantLocation = let restaurantRange = 2.5let otherRestaurantLocation = let otherRestaurantRange = 1.5// Pythagorean Theorem # $func distance(from source: (x: Int, y: Int), to target: (x: Int, y: Int))-> Double { let distanceX = Double(source.x - target.x) let distanceY = Double(source.y - target.y) return sqrt(distanceX * distanceX + distanceY * distanceY)}func isInDeliveryRange(location: (x: Int, y: Int)) -> Bool { let deliveryDistance = distance(from: location, to: restaurantLocation) let secondDeliveryDistance = distance(from: location, to: otherRestaurantLocation) return deliveryDistance < restaurantRange ||secondDeliveryDistance < otherRestaurantRange}

数据类型

String Interpolation(string 模板)

ES5中如果需要将string进行拼接,需要直接将字符串相加.
es6中支持模板式的写法来实现该功能.

//ES5的写法
var API_KEY = '1234fafwa';
var url = 'http://someapi.com/request&key=' + API_KEY;

//使用ES6的模板string的写法
var API_KEY = '1234fafwa';
var url = `http://someapi.com/request&key=${API_KEY}`;

澳门威斯尼人平台登陆 3

  1. String,Number,Boolean,Undefined,Null,Object
  2. 使用typeof后有string,number,boolean,undefined,object,function
  • ### Your first structure
  • 注意和数据类型相比,少了null多了function
  • 结果都是小写

  1. undefinednull使用==相等。计算时,undefinedNaNnull是0
  2. 返回布尔值的地方
struct Location { let x: Int let y: Int }
  • 关系运算符
  • &&,||,!
  • ### Your second structure
  1. 转化为false的情况

  • ”,0,NaN,undefined,null,false
struct DeliveryArea { var range: Double let center: Location}
  1. if后需要布尔类型,[]{}其实是true
  • ### 完整示例:

数值

  1. Number.MAX_VALUENumber.MIN_VALUE
  2. 科学记数法
struct Location { let x: Int let y: Int}struct DeliveryArea { var range: Double let center: Location}func distance(from source: (x: Int, y: Int), to target: (x: Int, y: Int)) -> Double { let distanceX = Double(source.x - target.x) let distanceY = Double(source.y - target.y) return sqrt(distanceX * distanceX + distanceY * distanceY)}let areas = [ DeliveryArea(range: 2.5, center: Location(x: 2, y: 4)), DeliveryArea(range: 4.5, center: Location(x: 9, y: 7))]func isInDeliveryRange(_ location: Location) -> Bool { for area in areas { let distanceToStore = distance(from: (area.center.x, area.center.y), to: (location.x, location.y)) if distanceToStore < area.range { return true } } return false}let customerLocation1 = Location(x: 8, y: 1)let customerLocation2 = Location(x: 5, y: 5)print(isInDeliveryRange(customerLocation1)) // falseprint(isInDeliveryRange(customerLocation2)) // true
  • 当小数点前有21位,还是正常显示。有22位,开始科学计数
  • 当小数点后有5位0,正常显示。有6位0,开始科学计数
  1. 各进制前缀,0x十六,0o八,0b
  2. NaN和isNaN()
  3. Infinity和isInfinity()
  4. parseInt()第二个参数说明了数据是什么进制。同时,只能转化为十进制

字符串

struct Contact { var fullName: String var emailAddress: String} var person = Contact(fullName: "Grace Murray", emailAddress: "grace@navy.mil") let name = person.fullName // Grace Murraylet email = person.emailAddress // grace@navy.mil
  1. 长字符换行,每行后用\
  2. 转义字符
  • ### Default values
  • 可有转移符号\n,\r,\t,\\
  • 可有转移字符,都对应unicode码点
    • \HHH三位八进制
    • \xHH两位十六进制
    • \uHHHH四位十六进制

  1. bitByteKBMBGBTB
struct Contact { var fullName: String var emailAddress: String var type = "Friend"}
  • 存储单位和网速的单位,不管是 B 还是 b,代表的都是 字节 Byte。
  • 带宽的单位,不管是 B 还是 b,代表的都是 比特 bit 。
    • ### Getter,举个栗子
  1. Base64是最常见的用于传输(8Bit)字节码的编码方式
  2. ASCII 是针对英文字符编码的方式
  3. Unicode 是针对多种语言进行编码的方式

  • 为了解决Unicode编码在互联网上传播的问题,各种规范出现utf-8,代表每次8个位传输数据
struct TV { var height: Double // 存储属性 var width: Double // 存储属性 // 1 var diagonal: Int { // 计算属性 // 2 let result = sqrt(height * height + width * width) // 3 let roundedResult = result.rounded() // 4 return Int(roundedResult) }} var tv = TV(height: 53.93, width: 95.87)let size = tv.diagonal // 110 tv.width = tv.height // 改变width,diagonal通过计算发生变化let diagonal = tv.diagonal // 76
  1. GBK本来扩展自ASCII,后渐渐形成GBK。因为还有很多少数名族的语言
  • ### Getter and setter

对象

  1. 创建对象
var diagonal: Int { // 1 get { // 2 let result = sqrt(height * height + width * width) let roundedResult = result.rounded(.toNearestOrAwayFromZero) return Int(roundedResult) } set { // 3 let ratioWidth = 16.0 let ratioHeight = 9.0 // 4 height = Double * ratioHeight / sqrt(ratioWidth * ratioWidth + ratioHeight * ratioHeight) width = height * ratioWidth / ratioHeight }}tv.diagonal = 70 // 通过设置tv.diagonal,自动获得tv.height和tv.widthlet height = tv.height // 34.32...let width = tv.width // 61.01... - ###说明:1。因为你想要包括一个setter,你现在必须明确哪些计算组成的getter和setter,所以你周围每个代码块和花括号之前得到或设置。这不是只读属性,计算所需的单一代码块隐式getter。2。您可以使用与前面相同的代码来获得计算值。3。对于setter,你通常需要做出这样的假设。在这种情况下,您为屏幕比提供了一个合理的默认值。4。考虑到一个高和宽,给定一个对角和一个比,面积有点深。你可以用一点时间来解决它们,但我已经为你做了一些脏活,并在这里提供了它们。关注的重点是: - newValue常量允许您使用在赋值期间传递的任何值。 - 记住,对角线是一个整数,所以在计算中使用它时,你必须先把它转换成双精度。 - 一旦你做了计算,你就会分配电视结构的高度和宽度。
  • {}
  • new Object
  • Object.create(prototype),这种可以利用原型创造一个新的对象,经常用在继承
  • ### Type properties
  1. 对象引用

  • 两个变量对引用同一个对象,则共用
  • 其中一个取消对对象的引用,不会影响另外一个
struct Level { static var highestLevel = 1 // 类型属性 let id: Int var boss: String var unlocked: Bool}let level1 = Level(id: 1, boss: "Chameleon", unlocked: true)let level2 = Level(id: 2, boss: "Squid", unlocked: false)let level3 = Level(id: 3, boss: "Chupacabra", unlocked: false)let level4 = Level(id: 4, boss: "Yeti", unlocked: false)

var a = {}
var b = a
a = 1
console.log(b)  // {}

  1. 检测全局变量,使用a in window方式,如果直接使用if(a)在没有a的情况下会报错
  2. delete成功删除之后返回true,不能删除继承的属性
  3. in用于检测对象是否含有某个属性,也就是键名
  4. for in遍历对象和继承的可遍历属性,跳过不可枚举属性
  5. 关于属性的两个方法
struct Level { static var highestLevel = 1 // 类型属性 let id: Int var boss: String var unlocked: Bool { didSet { if unlocked && id > Level.highestLevel { Level.highestLevel = id } } }}现在,当玩家解锁一个新级别时,如果级别是新的高度,它将更新highestLevel类型属性。这里有几件事需要注意:您可以从didSet观察器中访问未锁定的值。请记住,在设置了值之后,didSet就会被调用。即使您是在类型的一个实例中,您仍然需要访问类型属性,它们的全名都是级别的。高水平的,而不是仅仅是高水平的。另外,请记住,在初始化期间设置属性时,不会调用willSet和didSet观察器;只有当您为完全初始化的实例分配一个新值时,才会调用它们。这意味着属性观察器只对可变属性有用,因为常量属性只在初始化期间设置。
  • Object.defineProperty(obj,propName,{})
  • obj.hasOwnProperty()

数组

  1. 其实arr[0]等同与arr['0']arr[0.00]
  2. 类数组对象
struct LightBulb { static let maxCurrent = 40 var current = 0 { didSet { if current > LightBulb.maxCurrent { print("Current too high, falling back to previous setting.") current = oldValue } } }} - ###测试:var light = LightBulb()light.current = 50var current = light.current // 0light.current = 40current = light.current // 40// 你试着把灯泡设置为50安培,但是灯泡拒绝了输入。很酷!
  • arguments
  • 元素集合
  • 字符串

澳门威斯尼人平台登陆 4

  1. 类数组转化成数组
  • Array.property.slice.call(arrayLike)

  1. 数组也能使用in,会将索引和属性遍历出来
  2. 数组空位计算在内,但是空位和undefined是不一样的。使用数组的forEach方法、for...in结构、以及Object.keys方法进行遍历,空位都会被跳过
struct Circle { // 这里,您不相信从标准库中可以获得的pi值;您需要自己计算它 lazy var pi = { return ((4.0 * atan(1.0 / 5.0)) - atan(1.0 / 239.0)) * 4.0 }() var radius = 0.0 var circumference: Double { mutating get { return pi * radius * 2 } } init (radius: Double) { self.radius = radius }}// 您可以使用它的初始化器创建一个新的圆,而pi计算将不会运行:var circle = Circle(radius: 5) // got a circle, pi has not been runlet circumference = circle.circumference // 31.42 // also, pi now has a value

函数

澳门威斯尼人平台登陆 5

  1. 不会重载,后边的会覆盖前边的同名函数
  2. if语句块中只能使用函数表达式,不能使用函数定义
  3. fn.name属性返回紧跟在function关键字之后的那个函数名
  4. fn.name返回定义时参数个数
  5. fn.toString()返回函数的源码
  6. 函数的作用域是定义时所在的作用域,和运行时作用域无关

在前一章中,我们学习了属性,它们是常量和变量,它们是结构的一部分。方法,正如您已经看到的,仅仅是驻留在结构中的函数。在本章中,您将更深入地了解方法和初始化器。与属性一样,您将开始设计更复杂的结构。在本章中学习的内容将适用于所有命名类型的方法,包括类和枚举,您将在后面的章节中看到。

var a = 1;
var x = function () {
  console.log(a);
};
function f() {
  var a = 2;
  x();
}

f() // 1

通过计算属性,您可以在最后一章看到,您可以从一个结构中运行代码。这听起来很像一种方法。有什么区别呢?这确实取决于风格,但有一些有用的想法可以帮助你做出决定。属性保存您可以得到和设置的值,而方法执行工作。有时,当方法的唯一目的是返回一个值时,这种区别就会变得模糊。问问自己,你是否想要能够设定一个价值,并获得价值。计算属性可以在内部设置一个setter组件来编写值。另一个需要考虑的问题是,计算是否需要进行大量的计算或从数据库中读取数据。即使是一个简单的值,一个方法也可以帮助您向未来的开发人员指出,这个调用在时间和计算资源方面是昂贵的。如果调用很便宜,就使用计算属性。

  1. 当函数传入对象作为参数的时候

澳门威斯尼人平台登陆 6

  • 如果修改对象某个属性,将对外部存在影响
  • 如果是替换掉整个参数,不会影响到外部
  1. 同名参数,取后出现的值。即使只传入第一个,但是也会取后者undefined
  2. arguments.callee返回函数本身
  3. 闭包作用
let months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]struct SimpleDate { var month: String}func monthsUntilWinterBreak(from date: SimpleDate) -> Int { return months.index(of: "December")! - months.index(of: date.month)!}print(monthsUntilWinterBreak(from:SimpleDate(month: "May"))) // 7
  • 读取函数内部的变量
  • 让变量始终保存在内存中,保存上次运行的状态

如果把方法定义在Struct中会不会更容易理解呢

  1. 函数的立即调用有两种写法
  2. eval在严格模式下,声明变量不能影响外部变量。但是赋值语句等还是可以改变外部变量值
struct SimpleDate { var month: String func monthsUntilWinterBreak1(from date: SimpleDate) -> Int { return months.index(of: "December")! - months.index(of: date.month)! } // 推荐写法 func monthsUntilWinterBreak() -> Int { return months.index(of: "December")! - months.index(of: self.month)! }}let date = SimpleDate(month: "October")let monthsLeft = date.monthsUntilWinterBreak(from: date) // 2

运算符

  1. 字符串的比较是按照字典的顺序,靠后的大

结构中的方法不能改变实例的值,而不被标记为“ mutating”。变异关键字标记了一个改变结构值的方法。由于一个结构是一个值类型,每次它在一个应用程序中传递时,系统就会复制它。如果一个方法改变了其中一个属性的值,那么原来的实例和复制的实例就不再是等价的了。通过将一个方法标记为mutating,您告诉快速编译器这个方法不应该在常量上调用。这就是Swift知道在编译时允许哪些方法和拒绝哪些方法。如果您在一个常量结构上调用一个mutating方法,编译器会将其标记为一个错误,在您运行程序之前必须纠正这个错误。

struct SimpleDate { var month: String var day: Int init(month: String, day: Int) { self.month = month self.day = day } mutating func advance() { day += 1 // 没有加mutating修饰func的话,会编译错误,不能在结构体提直接修改day的值 }}var current = SimpleDate(month: "December", day: 30)current.advance()let currentMonth = current.month // December; should be January!let currentDay = current.day // 31;
// 严重注意,字符串形式的数值比较
'2' > '11'  // true
[2] > [11] // true,因为会转换成 '2' > '11'

澳门威斯尼人平台登陆 7没有加mutating修饰func的话,会编译错误.png

  1. 对象参与比较,会调用obj.valueOf().toString()
  2. 进制不同,但是转化为10进制相同,就全等
  3. 严格相等运算符比较的是地址,而大于或小于运算符比较的是值。

与类型属性一样,您可以使用类型方法来访问所有实例中的数据。您在类型本身上调用类型方法,而不是在实例上调用。要定义类型方法,您需要使用静态修饰符来对其进行前缀。类型方法对于一般情况下的类型是有用的,而不是特定的实例。

{} === {} // false
[] === [] // false
struct Math { // 1 类方法,关键字static修饰 static func factorial(of number: Int) -> Int { // 2 return (1...number).reduce }}// 3let factorial = Math.factorial // 720
  1. 原始数据类型有string,number,boolean。它们混合比较的时候,会转换成数值类型再进行比较

'true' == true //false 
// 第一步 Number('true') ---> NaN
// 第二部 Number(true) ---> 1
// NaN == 1 ---> 结果为false
struct SimpleDate { var month: String var day: Int }extension SimpleDate { init() { month = "March" day = 1 }}let defaultDay = SimpleDate()let childrensDay = SimpleDate(month: "May", day: 5)
  1. 对象与原始类型值比较,对象转化成原始类型的值,再进行比较。

您学习了结构体,它是一个命名类型,它允许您定义自己的类型。在本章中,您将熟悉,它们与结构非常相似,它们被命名为类型,具有属性,并且可以定义方法。但是,您将学习的类是引用类型,而不是值类型,它们的功能和优点与它们的结构相比具有很大的不同。虽然您经常在应用程序中使用结构来表示值,但通常使用类来表示对象。

    • Reference typesclass

[1] == 1 // true
[1] == '1' // true
[1] == true // true

  1. 逻辑运算符和位运算符,位运算符可以用来扩大或缩小2的n次方
  2. void用来防止页面跳转
  3. 赋值运算符和三元运算符,是从右到左的
class Person { let name: String init(name: String) { self.name = name }}var var1 = Person(name: "John")

数据类型转换

澳门威斯尼人平台登陆 8内存.png如果您要创建一个新的变量var2并将其赋值为var1的值:var var2 = var1澳门威斯尼人平台登陆 9内存.png

  1. 主要是String,Boolean,Number之间的转换

错误处理机制

  1. Error的namestack属性存在兼容问题,后者可以显示错误首先是在哪里抛出的
  2. 错误类型和出现原因
struct Person { let name: String}var1 = Person(name: "John")
  • synaxError 语法错误
  • referenceError 引用错误
    • 调用不存在的值
    • 不允许赋值
  • typeError 类型错误
    • 由 new 引起,不能对基本类型使用 new
  • URIError url参数不正确的时引起
    • 主要由编码的几种方法引起
  • evalError 使用错误
  • rangeError

澳门威斯尼人平台登陆 8内存.png如果您要创建一个新的变量var2并将其赋值为var1的值,然后,var1的值将被复制到var2:var var2 = var1澳门威斯尼人平台登陆 11内存.png

  1. catch中的return语句会延迟到finally中执行

编程风格

当您创建诸如类之类的引用类型时,系统将实际的实例存储在称为堆的内存区域中。一个值类型的实例,例如一个结构体,驻留在一个名为堆栈的内存区域中,除非该值是类实例的一部分,在这种情况下,该值被存储在类实例的其余部分中。堆和堆栈都在执行任何程序时都具有重要的作用。对它们是什么以及它们的工作原理有一个大致的了解,可以帮助你理解类和结构之间的功能差异:该系统使用堆栈来存储执行的即时线程上的任何内容;它受到CPU的严格管理和优化。当函数创建一个变量时,堆栈会存储该变量,然后在函数退出时销毁它。因为这个堆栈组织得很好,所以它非常高效,而且非常快。

  1. 关于()和空格的问题

澳门威斯尼人平台登陆 12help.png

  • 定义非匿名函数和调用函数,函数名和()不能有空格
  • 其他情况,都有一个空格

当您创建一个类的实例时,您的代码请求堆上的一个内存块来存储实例本身;这是图表右侧的实例的第一个名称和最后一个名称。它将该内存的地址存储在堆栈的命名变量中;这是存储在图左侧的引用。当您创建一个struct时,值本身就存储在堆栈中,而堆永远不会涉及到。

  1. 全局变量可以使用大写区分
  2. 建议不要将目的不同的语句合并成一行、

值类型的工作

struct Location { var x: CGFloat var y: CGFloat}struct DeliveryArea { var range: Double let center: Location}var area1 = DeliveryArea(range: 2.5, center: Location(x: 2, y: 4))var area2 = area1print(area1.range) // 2.5print(area2.range) // 2.5area1.range = 4 print(area1.range) // 4.0print(area2.range) // 2.5 不会变为4.0

引用类型

class DeliveryArea { var range: Double let center: Location}var area1 = DeliveryArea(range: 2.5, center: Location(x: 2, y: 4))var area2 = area1print(area1.range) // 2.5print(area2.range) // 2.5area1.range = 4 print(area1.range) // 4.0print(area2.range) // 4.0 不会再是2.5 

在Swift中,===操作符让您检查一个对象的标识是否等于另一个对象的标识:

澳门威斯尼人平台登陆 13澳门威斯尼人平台登陆 14.png

防止类继承

class Person { //...}final class Student: Person { //...}// Build error!class StudentAthlete: Student { //...}

防止方法重写

class Student: Person { final func recordGrade(_ grade: Grade) {//...} }class StudentAthlete: Student { // Build error! override func recordGrade(_ grade: Grade) { //... } }

class Student { let firstName: String let lastName: String required init(firstName: String, lastName: String) { self.firstName = firstName self.lastName = lastName } //... 创建Student对象必须实现 required init(firstName: String, lastName: String),否则编译错误}Student(firstName: "留", lastName: "明")

澳门威斯尼人平台登陆 15不实现报错.png

class Student { convenience init(transfer: Student) { self.init(firstName: transfer.firstName, lastName: transfer.lastName) }}

enum Month { case january case february case march case april case may case june case july case august case september case october case november case december}func semester(for month: Month) -> String { switch month { case Month.august, Month.september, Month.october, Month.november, Month.december: return "Autumn" case Month.january, Month.february, Month.march, Month.april, Month.may: return "Spring" default: return "Not in the school year" }}

enum Month: Int { case january = 1, february = 2, march = 3, april = 4, may = 5, june = 6, july = 7, august = 8, september = 9, october = 10, november = 11, december = 12}// 第一个赋值即可,后面的赋值可以省略,自动+1enum Month: Int { case january = 1, february, march, april, may, june, july, august, september, october, november, december}func monthsUntilWinterBreak(from month: Month) -> Int { return Month.december.rawValue - month.rawValue}monthsUntilWinterBreak(from: .april) // 8

 let fifthMonth = Month(rawValue: 5)monthsUntilWinterBreak(from: fifthMonth) // Error: value not unwrapped,可选值,必须明确类型解包monthsUntilWinterBreak(from: fifthMonth!) // Error: value not let fifthMonth = Month(rawValue: 5)!monthsUntilWinterBreak(from: fifthMonth) // 7

// 1enum Icon: String { case music case sports case weather var filename: String { // 2 return "\(rawValue.capitalized).png" }}let icon = Icon.weathericon.filename // Weather.pngicon.rawValue // Weathericon.hashValue // 2

交通灯

enum TrafficLight { case red, yellow, green}let trafficLight = TrafficLight.red

澳门威斯尼人平台登陆 16扫一扫,关注我.jpg

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图