桓台建设局网站,android编程软件,短视频平台推广,北京建设信息咨询中心网站一、Swift 存储属性和计算属性比较#xff1a;
存储型属性:用于存储一个常量或者变量 计算型属性: 计算性属性不直接存储值,而是用 get / set 来取值 和 赋值,可以操作其他属性的变化.
计算属性可以用于类、结构体和枚举#xff0c;存储属性只能用于类和结构体。存储属性可…一、Swift 存储属性和计算属性比较
存储型属性:用于存储一个常量或者变量 计算型属性: 计算性属性不直接存储值,而是用 get / set 来取值 和 赋值,可以操作其他属性的变化.
计算属性可以用于类、结构体和枚举存储属性只能用于类和结构体。存储属性可以是变量存储属性(用关键字 var 定义)也可以是常量存储属性(用关键字let定义)而计算属性只能用var定义计算属性不直接存储值而是提供一个 getter 和一个可选的setter来间接获取和设置其他属性或变量的值
var age 12var name 小花var kind 法斗//定义计算属性的getter方法该方法的返回值由age、name、kind三个存储属性决定var petInfo:String{get {return this is a pet which name is \(name),age is \(age), kind is \(kind)}set (newInfo){}}
二、inout关键字有什么作用
需要用到inout 关键字,调用函数时加 inout关键字本质是通过地址传递进行值修改的
三、OC和Swift中的protocol
OC和SwiftProtocol的共同点
本质都是抽取不同类的共同方法和属性声明供遵循协议的类或对象使用。 都可以通过定义协议实例deleagate来实现委托代理模式。 PS类比继承的概念继承父类的方式比较险隘子类和父类只能为同一基类且方法都有实现需在子类中override并不能把方法和属性完全独立出来且不能多继承。
OC和SwiftProtocol的区别核心
OC中的协议更单纯的受限于委托代理的含义多用于跨类的传值和回调通知。 而Swift是面向协议编程其思想是通过抽取不同类中的相同方法和属性实现模块化减少耦合。 Swift可以通过协议extension扩展缺省实现协议的方法OC不行。 Swift的协议不需要单独声明协议对象id delegate和指定代理delegate self只需要遵循协议的类实现声明或使用协议的缺省实现。
四、Swift 中的 enum 和 OC 中 有什么区别
OC 1.oc的枚举值相当于这个文件中的一个局部变量,只能是整型 2.不同枚举中枚举名称不可以一样在同一文件 Swift 3.枚举里可以写方法 4.枚举的rawValue可以是Float(float也是赋值的后面依次1)或是String或是没有 5.可以用Rank(rawValue: 3)方法创建一个枚举实例 6.枚举实例可以带参数
五、struct和class的区别
1swift中所有值类型struct、enum使用直接派发。 2swift中协议的extensions(类似于OC的分类)使用直接派发初始声明函数使用函数表派发 3swift中class中extensions使用直接派发初始化声明函数使用函数表派发dynamic修饰的函数使用消息派发。
Swift中mutating关键字指的是可变即可修改。用在structure和enumeration中,虽然结构体和枚举可以定义自己的方法但是默认情况下实例方法中是不可以修改值类型的属性。为了能够在实例方法中修改属性值可以在方法定义前添加关键字mutating。 在 Swift 中值类型存放在栈区引用类型存放在堆区。Swift 中典型的有 structenum以及 tuple 都是值类型。 当值类型的变量作为参数被传入函数时相当于创建了新的常量并初始化为传入的变量值该参数的作用域及生命周期仅存在于函数体内。 当引用类型的变量作为参数被传入函数时相当于创建了新的常量并初始化为传入的变量引用当函数体内操作参数指向的数据函数体外也受到了影响 6.当你的项目的代码是 Swift 和 Objective-C 混合开发时你会发现在 Objective-C 的代码里无法调用 Swift 的 Struct。因为要在 Objective-C 里调用 Swift 代码的话对象需要继承于 NSObject。 7.内存分配struct分配在栈中class分配在堆中。struct比class更“轻量级”struct是跑车跑得快class是SUV可以载更多的人和货物 3.struct是值类型Value Type,深拷贝。class是引用类型Reference Type浅拷贝。
六、Swift optional是什么类型的
optional类型是一个枚举类型有两个枚举值 1、None类型 2、Some(Wrapped) 这两个类型决定了optional类型的概念和含义有值或者没有值 1optional.None表示该类型没有值也就是nil。特别声明swift中的nil不在有指针含义而是表示且仅表示optional的.None。 2optional.Some(Wrapped)这是表示有值的情况Some类似于java或者c的泛类型的含义Wrapped 类似是封装的值。
optional的wrap和unwrap
使用optional类型该类型会对赋值过程和取值进行一些处理。 1赋值也被称为装包的过程wrapoptional类型会获取当前值的类型和具体值如int类型的数字100.当一个optional类型被赋值为这个值时其实optional记录了对应的类型someint和值部分wrapped100. 2取值也被称为解包的过程unwrapoptional根据记录的类型some如上面说的int和值部分wrapped100新建一个somewrapped同int100返回给程序 optional是swift特别声明的安全类型在使用过程中如果处理得当的话可以防止以前oc上很多因为数据没值导致的crash。个人还是比较推荐使用的虽然有时候有些解包的过程感觉特别麻烦但这都是一道道安全门阻断了很多crash的诞生。
七、rxswift中请求重试的方法是哪个
1catchError
enum ObError: Error {case error1
}let ob1 PublishSubjectString()
let ob2 PublishSubject.of(A, B)ob1.catchError { (error) - ObservableString inprint(error)return ob2
}.subscribe { event inprint(event)
}.disposed(by: disposeBag)
ob1.onNext(111)
ob1.onError(ObError.error1)
//next(111)
//error1
//next(A)
//next(B)
//completed
2,retry
var isFail true
let obs ObservableString.create { (ob) - Disposable inob.onNext(成功1)if isFail {ob.onError(ObError.error1)isFail false}ob.onNext(重试成功)ob.onCompleted()return Disposables.create()
}obs.retry(2).subscribe { event inprint(event)
}.disposed(by: disposeBag)next(成功1)
next(成功1)
next(重试成功)
completed
八、讲解一下Swift中的数据封装
封装主要有两大目的一是为了我们使用数据更加方便二是为了数据保护。 1、Swift 访问修饰符 在 Swift 语言中访问修饰符也分为三类分别是 private、internal、public。
Swift 的访问修饰符从 Xcode6 beta4 才开始支持。 Swift 对访问权限的控制不是基于类的而是基于文件的。 在 Swift 语言中若要设置某一属性的访问权限需在定义属性时加上相应的修饰前缀。 三类修饰符的访问权限
1private 所修饰的属性或者方法只能在当前 Swift 源文件里可以访问在别的文件里访问会出错。
2internal 是默认的访问权限。所修饰的属性或者方法在源代码所在的整个模块都可以访问。如果是框架或者是库代码则在整个框架内部可以访问框架由外部代码所引用时则不可访问。如果是 App 代码在整个 App 内部可以访问。
3public 所修饰的属性或者方法对于引用了该文件或者模块的文件来讲都能访问这些属性和方法。一般来说 public 的出现是为了 API 开发而设置。
Class Person {private var _weight: Int!var weight: Int {get {return _weight}set {_weight newValue}}
}
您甚至可以将变量设为公开只读并设为私有读写
class Person {public private(set) var weight: Int
}
九、Swift异常捕捉的方法有哪些
//
// ViewController.swift
// Throws
//
// Created by fe on 2017/3/7.
// Copyright © 2017年 fe. All rights reserved.
//import UIKitclass ViewController: UIViewController {override func viewDidLoad() {super.viewDidLoad()//如果在调用系统的方法时后面有throws则说明此方法会抛出异常如果方法会抛出异常则需要我们处理异常//创建正则表达式规则let pattern abcdefg//创建正则表达式队形/*在swift中提供三种处理异常的方式方式一try方式 程序员手动捕捉异常do { let regex try NSRegularExpression(pattern: pattern, options:.caseInsensitive)print(regex)}catch{print(error)}方式二try方式(常用方式) 系统帮助我们处理异常如果有异常则该方法返回nil如果没有异常则该方法返回对应的对象guard (try? NSRegularExpression(pattern: pattern, options: .caseInsensitive)) ! nil else {return}方式三try方式不建议使用非常危险这种方法直接告诉系统没有异常如果有异常则程序会崩溃let regex try! NSRegularExpression(pattern: pattern, options:.caseInsensitive)*/}}
函数中产生的异常只能在函数内部解决开发者也可以使用throws关键字将此函数声明为可抛异常函数此类声明则允许开发者在函数外解决函数内部抛出的异常
** 异常的捕获与处理
系统为我们提供了三种异常处理的方法1 使用do-catch结构来捕获处理异常、将异常映射为optional值终止异常传递2 使用try?来调用函数可以将异常映射为Optional值3 使用try!来强制终止异常的传递do-catch:do-catch结构是swift语言中处理异常最常用的方法开发者需要将可能抛出的异常的代码放入do结构中如果这部分代码中有抛出异常则会从catch块中寻找对应的异常类型如果找到对应的则会执行此catch块中的异常处理代码.
十、map函数有几种、分别讲解一下 高阶函数一共有下面几个
map对给定数组每一个元素执行闭包中的映射将映射结果放置在数组中返回。 flatMap对给定数组的每一个元素执行闭包中的映射对映射结果进行合并操做而后将合并操做后的结果放置在数组中返回。 compactMap对给定数组的每一个元素执行闭包中的映射将非空的映射结果放置在数组中返回。 filter对给定数组的每一个元素执行闭包中的操做将符合条件的元素放在数组中返回。 reduce对给定数组的每一个元素执行闭包中的操做对元素进行合并并将合并结果返回。