草庐IT

swift注意事项

lllaa 2023-03-28 原文

一、编程范式

Swift 可以面向协议编程(POP)、函数式编程、面向对象编程。

Object-C 以面向对象编程(OOP)为主,当然你可以引入类似ReactiveCocoa的类库来进行函数式编程。

从OOP思想到POP转变。

在Swift开发中,OOP和POP是相辅相成的,任何一方并不能取代另一方。POP能弥补OOP一些设计上的不足

关于面向协议编程:

1.优先考虑创建协议,而不是父类(基类)

2.优先考虑值类型(struct、enum)【结构体】,而不是引用类型(class)【类】

3.巧用协议的扩展功能 entension

4.不要为了面向协议而使用协议

二、oc与swift混编

有些第三方框架还是oc版本,利用桥接文件实现。

NS_REFINED_FOR_SWIFT

Objective-C 的 API 和 Swift 的风格相差比较大,Swift 调用 Objective-C 的API时可能由于数据类型等不 一致导致无法达到预期(比如,Objective-C 里的方法采用了C语言风格的多参数类型;或者 Objective-C 方法返回 NSNotFound,在 Swift 中期望返回 nil)。这时候就要 NS_REFINED_FOR_SWIFT了。

三、swift运行时

Swift中依然可以使用选择器,使用#selector(name)定义一个选择器

@objc修饰的方法才可以定义选择器。

selector(选择器)是依赖于runtime的,oc里才有runtime,纯swift里是不存在runtime的。

不管是纯 Swift 类还是继承自 NSObject 的类只要在属性和方法前面添加 @objc 关键字就可以使用 runtime。

四、Swift访问级别修饰符

open(公开权限)、 public(公有访问权限)、internal(内部权限也是默认权限)、fileprivate(文件私有权限)、private(私有权限)五个。

open :可以在任何地方被访问、继承、重写。

public :可以在任何地方被访问,在其他模块中不能被继承和重写。

internal :在整个模块内都可以被访问。

fileprivate:其修饰的属性可以在同一个文件被访问、继承和重写

private :其修饰的[属性]和[方法]只能在本类被访问和使用。

@objc , @objc(Type)和 @objcMembers

@objc用于当前类可以在OC中使用,

@objc(Type)可以给Swift类重命名, 可以在OC中通过runtime获取类

@objcMembers用于当前类、子类、类扩展和子类扩展的所有属性和方法都加上@objc


五.?(可选类型)和!(隐式可选类型)的区别

? 在判断的类型为空时 不会让 程序闪退,甚至可以在?后给 变量初始一个值。比如 textString? : "aaaa"。

!号会让程序默认改变量强制不为空,如果不幸为空了,程序直接闪退


六.自定义UIView或者cell 设置图片圆角

override func layoutSubviews() {

      super.layoutSubviews()

      userHeadbBtn.clipRectCorner(direction: .allCorners, cornerRadius: 50/2)

      mainView.clipRectCorner(direction: .allCorners, cornerRadius: 10)

      mainView.addShadowToView(color: UIColor.black)

}

自定义的组件里如果需要设置圆角、设置阴影等产生效果必须在layoutSubviews 或者awakeFromNib中调用方法才能有效果

七.引文文件

import Kingfisher

@_exportedimportMJRefresh

@_exported import 加入头文件之前的话,就是全局引用


八.类与结构体的区别

类是引用类型,结构体是值类型。

值类型在传递和赋值时将进行复制,而引用类型则只会使用引用对象的一个指向。引用类型是在堆上,而值类型是在栈上进行存储和操作。相比栈上的操作,对上的操作更加复杂耗时,所以苹果官方推荐使用结构体,这样可以提高App运行的效率。

class有这几个功能struct没有的:

class可以继承,这样子类可以使用父类的特性和方法。

类型转换可以在runtime的时候检查和解释一个实例的类型。

可以用deinit来释放资源。

一个类可以被多次引用。

struct也有这样几个优势:

结构较小,适用于复制操作,相比于一个class的实例被多次引用更加安全。

无序担心内存泄漏或者多线程冲突问题。

有关swift注意事项的更多相关文章

  1. 阿里云国际版免费试用:如何注册以及注意事项 - 2

    作为新的阿里云用户,您可以50免费试用多种优惠,价值高达1,700美元(或8,500美元)。这将让您了解和体验阿里云平台上提供的一系列产品和服务。如果您以个人身份注册免费试用,您将获得价值1,700美元的优惠。但是,如果您是注册公司,您可以选择企业免费试用,提交基本信息通过企业实名注册验证,即可开始价值$8,500的免费试用!本教程介绍了如何设置您的帐户并使用您的免费试用版。​关于免费试用在我们开始此试用之前,您还必须遵守以下条款和条件才能访问您的免费试用:只有在一年内创建的账户才有资格获得阿里云免费试用。通过此免费试用优惠,用户可以免费试用免费试用活动页面上列出的每种产品一次。如果您有多个帐

  2. ruby - 新手应注意的 Ruby Gotchas 是什么? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。社区在12个月前审查了是否重新打开此问题,并将其关闭:原始关闭原因未解决最近学习了Ruby编程语言,总的来说是一门很好的语言。但是我很惊讶地发现它并不像我预期的那么简单。更准确地说,“最小惊喜规则”在我看来并不是很受尊重(当然这是相当主观的)。例如:x=trueandfalseputsx#displaystrue!和著名的:puts"zeroistrue

  3. 基于3D卷积的图像序列特征提取与自注意力的车牌识别方法 - 2

    【摘 要】近年来,基于自注意力机制的神经网络在计算机视觉任务中得到广泛的应用。随着智能交通系统的广泛应用,面对复杂多变的交通场景,车牌识别任务的难度不断提高,准确识别的需求更加迫切。因此提出一个基于自注意力的免矫正的车牌识别方法T-LPR。首先对图像进行切片和序列化,并使用3D卷积对切片序列进行特征提取,从而得到图像的嵌入向量序列。然后将嵌入向量序列输入基于TransformerEncoder的编码器中,学习各个嵌入向量之间的关系并输出最终的编码结果。最后使用分类器进行分类。在多个公共数据集上的实验结果表明,所提方法对各类困难场景下的车牌识别都非常有效。【关键词】车牌识别 ; 图像嵌入向量 ;

  4. javascript - Node js/Angular js - 注意 : Provisional headers are shown - 2

    这个问题在这里已经有了答案:"CAUTION:provisionalheadersareshown"inChromedebugger(36个答案)关闭8年前。这是我的Angularjs片段代码:$http({method:'POST',withCredential:true,url:$scope.config.app_ws+'auth/signup',data:{user:$scope.auth}}).success(function(status,response){console.log(response);}).error(function(status,response){al

  5. 鼠标事件以及 onmouseover, onmouseout 鼠标移动事件动态渲染的注意点 - 2

    1.onmouseover指的是鼠标在进入某个元素的时候触发的事件2.onmouseout指的是鼠标在离开某个元素时触发的事件其他onclick-------------------------------------鼠标单击触发ondblclick----------------------------------鼠标双击触发onmousemove---------------鼠标在上面移动时触发具体例子:下面是代码Document#root{width:1200px;height:900px;margin:40pxauto;background-color:black;position:r

  6. javascript - 作为 Prototype 用户,我应该注意哪些 jQuery 烦恼? - 2

    我们正在考虑将我们的站点从Prototype切换到jQuery。由于对Prototype太熟悉了,我很清楚Prototype的一些限制或烦人之处。我想问jQuery用户的问题是:使用jQuery一段时间后,您觉得什么令人沮丧?有没有关于jQuery的事情让您考虑切换(返回)到Prototype? 最佳答案 我认为唯一让我着迷的是,当我对单个元素进行选择查询时,我必须记住它返回一个元素数组,即使我知道只有一个元素。通常,这没有任何区别,除非您想直接与元素交互而不是通过jQuery方法。 关

  7. javascript - 为什么控制台会注意到我在更改原型(prototype)之前更改了原型(prototype)? - 2

    我正在学习Javascript原型(prototype)并用这个javascript制作了一个Fiddle(http://jsfiddle.net/3MuZa/1/):functionAnimal(name,sound){this.name=name;this.sound=sound;}vardog=newAnimal("Dog","Bark");console.debug(dog.__proto__);Animal.prototype.makeSound=function(){console.log(this.sound);};有趣的是,console.debug(dog.__pro

  8. javascript - 注意到 JSON.stringify 的不同实现之间存在奇怪的差异 - 2

    假设我有一个相当嵌套的JS对象,我需要对其进行JSON编码:varfoo={"totA":-1,"totB":-1,"totC":"13,052.00","totHours":154,"groups":[{"id":1,"name":"NameA","billingCodes":[{"bc":"25","type":"hours","hours":"5","amount":"$25.00"}]}]};如果我使用native浏览器JSON.stringify(在Chrome、Firefox、IE9/10中测试)对其进行JSON编码,我会得到一个如下所示的JSON字符串(这就是我期待):N

  9. javascript - 父窗口是否可以注意到子窗口是否已关闭? - 2

    我有父窗口(opener)和子窗口(popup)------------------------|||||parent|----->openspopup|child|||||-------------------------假设,在父页面中,我有js函数hello()为了让child在关闭子窗口时调用父的hello()并传递一个参数,我可以这样做,window.close();window.opener.hello(someArgument);这将关闭窗口并调用父级的hello();但是如果我不想在子页面中使用代码window.opener.hello()怎么办?我的意思是我希望代码仅

  10. 注意!华为折叠屏手机的原厂膜不能自己撕! - 2

    对于用惯了直板手机的朋友来说,新机开箱撕膜是一件十分有“仪式感”的事情,但是对于折叠屏手机来说,这样的操作万万不可。华为折叠屏手机在使用的过程中也有着和传统智能手机不一样的注意事项,下面这几点大家在入手折叠屏手机之后需要牢记!1、出厂自带的专用屏幕保护膜,不要自行撕除或粘贴其他保护膜华为全系的折叠屏手机在出厂会自带专用的屏幕保护膜,这层膜是不能撕掉的,更不能在撕掉后自行贴上第三方保护膜,这一点在手机包装内也有明确提示。华为折叠屏手机出厂自带特殊设计的专用保护膜是屏幕重要叠层,请勿自行撕除自带专用屏幕保护膜,以免损伤屏幕。出厂自带的保护膜因为是柔性高分子材料按压更容易变形,而形成胶印、气泡,但是

随机推荐