iOS 面试 Swift基础题

一、Swift 存储属性和计算属性比较:

存储型属性:用于存储一个常量或者变量
计算型属性: 计算性属性不直接存储值,而是用 get / set 来取值 和 赋值,可以操作其他属性的变化.

  • 计算属性可以用于类、结构体和枚举,存储属性只能用于类和结构体。
  • 存储属性可以是变量存储属性(用关键字 var 定义),也可以是常量存储属性(用关键字let定义),而计算属性只能用var定义
  • 计算属性不直接存储值,而是提供一个 getter 和一个可选的setter,来间接获取和设置其他属性或变量的值
var age = 12
    var 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的区别

1)swift中所有值类型:struct、enum使用直接派发。
2)swift中协议的extensions(类似于OC的分类)使用直接派发,初始声明函数使用函数表派发
3)swift中class中extensions使用直接派发,初始化声明函数使用函数表派发,dynamic修饰的函数使用消息派发。

Swift中,mutating关键字指的是可变即可修改。用在structure和enumeration中,虽然结构体和枚举可以定义自己的方法,但是默认情况下,实例方法中是不可以修改值类型的属性。为了能够在实例方法中修改属性值,可以在方法定义前添加关键字mutating。
在 Swift 中,值类型,存放在栈区;引用类型,存放在堆区。Swift 中,典型的有 struct,enum,以及 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类型的概念和含义,有值或者没有值:
1)optional.None表示该类型没有值,也就是nil。(特别声明,swift中的nil不在有指针含义,而是表示且仅表示optional的.None)。
2)optional.Some(Wrapped)这是表示有值的情况,Some类似于java或者c++的泛类型的含义,Wrapped 类似是封装的值。

optional的wrap和unwrap

使用optional类型,该类型会对赋值过程和取值进行一些处理。
1)赋值也被称为装包的过程(wrap),optional类型会获取当前值的类型和具体值,如int类型的数字100.当一个optional类型被赋值为这个值时,其实optional记录了对应的类型(some)int,和值部分(wrapped)100.
2)取值也被称为解包的过程(unwrap),optional根据记录的类型(some)如上面说的int,和值部分(wrapped)100,新建一个some(wrapped)同int(100)返回给程序
optional是swift特别声明的安全类型,在使用过程中如果处理得当的话可以防止以前oc上很多因为数据没值导致的crash。个人还是比较推荐使用的,虽然有时候有些解包的过程感觉特别麻烦,但这都是一道道安全门,阻断了很多crash的诞生。

七、rxswift中请求重试的方法是哪个?

1,catchError

enum ObError: Error {
    case error1
}

let ob1 = PublishSubject<String>()
let ob2 = PublishSubject.of("A", "B")

ob1.catchError { (error) -> Observable<String> in
    print(error)
    return ob2
}.subscribe { event in
    print(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 = Observable<String>.create { (ob) -> Disposable in
    ob.onNext("成功1")
    if isFail {
        ob.onError(ObError.error1)
        isFail = false
    }
    ob.onNext("重试成功")
    ob.onCompleted()
    return Disposables.create()
}

obs.retry(2).subscribe { event in
    print(event)
}.disposed(by: disposeBag)

next(成功1)
next(成功1)
next(重试成功)
completed

八、讲解一下Swift中的数据封装

封装主要有两大目的:一是为了我们使用数据更加方便,二是为了数据保护。
1、Swift 访问修饰符
在 Swift 语言中,访问修饰符也分为三类,分别是 private、internal、public。

Swift 的访问修饰符从 Xcode6 beta4 才开始支持。
Swift 对访问权限的控制,不是基于类的,而是基于文件的。
在 Swift 语言中,若要设置某一属性的访问权限,需在定义属性时加上相应的修饰前缀。
三类修饰符的访问权限

1)private 所修饰的属性或者方法只能在当前 Swift 源文件里可以访问,在别的文件里访问会出错。

2)internal 是默认的访问权限。所修饰的属性或者方法在源代码所在的整个模块都可以访问。如果是框架或者是库代码,则在整个框架内部可以访问,框架由外部代码所引用时,则不可访问。如果是 App 代码,在整个 App 内部可以访问。

3)public 所修饰的属性或者方法对于引用了该文件或者模块的文件来讲,都能访问这些属性和方法。一般来说 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 UIKit

class 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函数

高阶函数一共有下面几个:

map:对给定数组每一个元素,执行闭包中的映射,将映射结果放置在数组中返回。
flatMap:对给定数组的每一个元素,执行闭包中的映射,对映射结果进行合并操做,而后将合并操做后的结果放置在数组中返回。
compactMap:对给定数组的每一个元素,执行闭包中的映射,将非空的映射结果放置在数组中返回。
filter:对给定数组的每一个元素,执行闭包中的操做,将符合条件的元素放在数组中返回。
reduce:对给定数组的每一个元素,执行闭包中的操做对元素进行合并,并将合并结果返回。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/356861.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

爬虫学习笔记-get请求获取豆瓣电影排名多页数据★★★★★

1. 导入爬虫需要使用的包 import urllib.request import urllib.parse 2.创建请求函数 def create_request(page): # 定义不变的url部分 base_url https://movie.douban.com/j/chart/top_list?type5&interval_id100%3A90&action& # 根据规律定义data拼接url …

倒排索引的构建与查询

倒排索引是信息检索的重要技术&#xff0c;本文将基于中文短信数据&#xff08;数据集可在本文所附资源处下载或点击此处链接下载&#xff09;&#xff0c;编程构建倒排索引并实现布尔查询。 1. 功能设计 用户输入查询&#xff0c;按下回车键&#xff0c;如果该查询作为单独的…

宏景eHR FrCodeAddTreeServlet SQL注入漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

微信小程序|摇骰子

目录 简介设计与功能需求确定用户界面设计确定摇骰子动画效果确定随机数生成算法编码实现实现摇骰子动画测试与优化进行功能测试进行性能测试说明简介 制作一个摇骰子小程序是一个有趣且具有挑战性的项目。通过这个项目,你可以学习如何运用编程技术来模拟骰子的摇动和结果显示…

Linux的bash命令语法

可用点 #!/bin/bash # 文件要以上面开始,.sh结尾的文件不需要# 赋权文件可执行权限 chmod x <fileName># 获取java jar包启动的进程id ps -ef | grep *.jar | grep -v grep | awk {print $2}shell变量 变量命令规则&#xff1a; 只能包含字母、数字、下划线&#xff1…

麒麟系统—— openKylin 安装 mongodb

麒麟系统—— openKylin 安装 mongodb 一、准备工作1. 确保麒麟系统 openKylin 已经安装完毕。 二、下载解压 MongoDB二、增加环境变量三、配置MongoDB创建数据目录创建日志文件运行 四、加入到服务中 MongoDB是一款高性能、开源的NoSQL数据库&#xff0c;因其灵活的数据结构、…

基于DistFlow潮流的配电网故障重构MATLAB程序

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 简介 程序采用适用于辐射状网络的DistFlow潮流模型&#xff0c;可输入任意故障线路编号&#xff0c;得到优化重构结果。程序加入了辐射状和连续状约束&#xff0c;保证网络连通性和辐射性&#xff0c;改换成…

Linux CPU 负载说明

一、背景 工作中我们经常遇到CPU 负载高&#xff0c;CPU负载高意味着什么&#xff1f; CPU的负载是怎么计算的&#xff1f; top指令中的各个指标代表什么含义&#xff1f; 二、CPU 负载计算方法 在系统出现负载问题&#xff0c;通常会使用uptime和top确认负载&#xff0c;这两…

15、Kafka ------ SpringBoot 整合 Kafka (自动配置类 KafkaAutoConfiguration 源代码剖析)

目录 SpringBoot 整合 Kafka 的自动配置及源代码剖析Spring Boot 为 Kafka 提供的自动配置KafkaAutoConfiguration Kafka自动配置类源码解析1、自动配置类&#xff1a;KafkaAutoConfiguration 注解解析2、自动配置类&#xff1a;KafkaAutoConfiguration 配置的 bean1、KafkaTem…

2024 年, Web 前端开发趋势

希腊哲学家赫拉克利特认为&#xff0c;变化是生命中唯一不变的东西。这句话适用于我们的个人生活、行业和职业领域。 尤其是前端开发领域&#xff0c;新技术、开发趋势、库和框架不断涌现&#xff0c;变化并不陌生。最近发生的一些事件正在改变开发人员构建网站和 Web 应用的方…

mysql中的锁

按照锁的粒度分 表锁 表级锁&#xff0c;增删改操作时&#xff0c;会给正张表加锁&#xff1b; myisam支持表级锁&#xff0c;innodb中默认没有使用表锁&#xff0c; 特点&#xff1a;虽然加锁的开销小&#xff0c;但是并发性能低。 间隙锁 满足某些条件&#xff0c;获取…

Selenium教程11:模拟账号密码,自动登入qq空间

Python爬虫教程30&#xff1a;Selenium网页元素&#xff0c;定位的8种方法&#xff01; Selenium自动化教程02&#xff1a;浏览器options配置及常用的操作方法 Selenium自动化教程03&#xff1a;延时等待的3种方式 Selenium自动化教程04&#xff1a;鼠标键盘网页的模拟操作 …

AJAX进阶(重点)

目录 ◆ 同步代码和异步代码 ◆ 回调函数地狱和 Promise 链式调用 什么是回调函数地狱&#xff1f; Promise - 链式调用 什么是Promise链式调用&#xff1f; Promise 链式应用 &#xff08;重点&#xff09; ◆ async 和 await 使用 async函数和await_捕获错误 ◆ 事…

算法设计与分析实验:滑动窗口与二分查找

目录 一、寻找两个正序数组的中位数 1.1 具体思路 1.2 流程展示 1.3 代码实现 1.4 代码复杂度分析 1.5 运行结果 二、X的平方根 2.1 具体思路 2.2 流程展示 2.3 代码实现 2.4 代码复杂度分析 2.5 运行结果 三、两数之和 II-输入有序数组 3.1 采用二分查找的思想 …

ES6详解

一 let 和 const ES6中可以使用let和const声明变量&#xff0c;用法类似于var const声明的为常量&#xff0c;不可修改&#xff08;但声明对象&#xff0c;对象中的属性可以修改&#xff09;&#xff0c;由于这个特性&#xff0c;它需要在声明的同时就赋值&#xff0c;否则报错…

SpringBoot+SqlServer查询接口

SpringBootSqlServer查询接口 文章目录 SpringBootSqlServer查询接口1. pom环境配置2. common工具包3. 实体类接口映射4. Service层Controller层 需求&#xff1a;根据站号查询前一个小时的所有数据&#xff0c;将数据返回格式为Map<String,List<Map<String,String>…

双非本科准备秋招(9.2)——力扣哈希

1、383. 赎金信 跟昨天的题大同小异&#xff0c;因为只有26个字母&#xff0c;所以可以建个有26个坑位的数组。 做完昨天的题目&#xff0c;这个题没啥新意。 class Solution {public boolean canConstruct(String ransomNote, String magazine) {int[] hashTable new int[…

语言模型大战:GPT、Bard与文心一言,谁才是王者?

如何对GPT-3.5、GPT-4、Bard、文心一言、通义千问的水平进行排序&#xff1f; 在聊技术原理之前我们来先看看几个产品的团队背景 一、团队背景 1.1、ChatGPT ChatGPT团队的成员大多具有计算机科学、人工智能、自然语言处理、机器学习等相关领域的高等教育背景&#xff0c;有…

十分钟发布自己的NFT

概述 本文将以一个例子来说明如何在opensea快速发布自己的NFT智能合约&#xff08;ERC721&#xff09;。本着DRY&#xff08;Dont Repeat Yourself&#xff09;原则&#xff0c;我们需要站在巨人的肩膀上来搭建自己的应用&#xff0c;使用经过社区审计和实践检验的代码可以有效…

【Netty技术专题】「原理分析系列」Netty强大特性之ByteBuf零拷贝技术原理分析

零拷贝Zero-Copy 我们先来看下它的定义&#xff1a; “Zero-copy” describes computer operations in which the CPU does not perform the task of copying data from one memory area to another. This is frequently used to save CPU cycles and memory bandwidth when t…