关于swift:self-与-Self

简略说说 Swift 中的 self 和 Self。总结下就是:self 是在实例办法或闭包中援用以后实例的关键字。Self 是在协定中援用遵循该协定的类型自身的关键字。 self:在一个实例办法或闭包中,self 是一个非凡的关键字,用于援用以后实例。它指代以后实例对象,能够用于拜访和操作实例的属性、办法和下标等成员。 class MyClass { var name: String init(name: String) { self.name = name } func printName() { print("My name is \(self.name)") }}let obj = MyClass(name: "John")obj.printName() // 输入 "My name is John"在上述示例中,self.name 援用了类中的属性 name,而 self 代表以后实例本身。 Self:在协定中,Self 是一个非凡的关键字,用于援用遵循该协定的类型自身。它以大写字母结尾,示意类型自身,而不是特定的实例。 protocol Printable { static func printSomething()}class MyClass: Printable { static func printSomething() { print("Printing something") }}MyClass.printSomething() // 输入 "Printing something"在上述示例中,Self 用作协定 Printable 中的关联类型,它示意遵循该协定的理论类型(例如 MyClass)。在协定中,Self 示意理论实现该协定的类型。 ...

September 22, 2023 · 1 min · jiezi

关于swift:百度工程师移动开发避坑指南Swift语言篇

作者 | 启明星小组上一篇咱们介绍了挪动开发常见的内存透露问题,见《百度工程师挪动开发避坑指南——内存透露篇》。本篇咱们将介绍Swift语言局部常见问题。 对于Swift开发者,Swift较于OC一个很大的不同就是引入了可选类型(Optional),刚接触Swift的开发者很容易在相干代码上踩坑。 本期咱们带来与Swift可选类型相干的几个避坑指南:可选类型要判空;防止应用隐式解包可选类型;正当应用Objective-C标识符;审慎应用强制类型转换。心愿能对Swift开发者有所帮忙。 一、可选类型(Optional)要判空在Objective-C中,能够应用nil来示意对象为空,然而应用一个为nil的对象通常是不平安的,如果应用不慎会呈现解体或者其它异样问题。在Swift中,开发者能够应用可选类型示意变量有值或者没有值,能够更加清晰的表白类型是否能够平安的应用。如果一个变量可能为空,那么在申明时能够应用?来示意,应用前须要进行解包。例如: var optionalString: String?在应用可选类型对象时,须要进行解包操作,有两种解包形式:强制解包与可选绑定。 强制解包应用 ! 润饰一个可选对象 ,相当于通知编译器『我晓得这是一个可选类型,但在这里我能够保障他不为空,编译时请疏忽此处的可空校验』,例如: let unwrappedString: String = optionalString! // 运行时报错:Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value这里应用 ! 进行了强制解包,如果optionalString为nil,将会产生运行时谬误,产生解体。因而,在应用 ! 进行强制解包时,必须保障变量不为nil,要对变量进行判空解决,如下: if optionalString != nil { let unwrappedString = optionalString!}相较于强制解包的不安全性,一般而言举荐另一种解包形式,即可选绑定。例如: if let optionalString = optionalString { // 这里optionalString不为nil,是曾经解包后的类型,能够间接应用}综上,在对可选类型进行解包时应尽量避免应用强制解包,采纳可选绑定代替。如果肯定要应用强制解包,那么必须在逻辑上齐全保障类型不为空,并且做好正文工作,以减少后续代码的可维护性。 二、防止应用隐式解包可选类型(Implicitly Unwrapped Optionals)因为可选类型每次应用之前都须要进行显式解包操作,有时变量在第一次赋值之后,就会始终有值,如果每次应用都显式解包,显得繁琐,Swift引入了隐式解包可选类型,隐式解包可选类型能够应用 ! 来示意,并且应用时不须要显式解包,能够间接应用,例如: var implicitlyUnwrappedOptionalString: String! = "implicitlyUnwrappedOptionalString"var implicitlyString: String = implicitlyUnwrappedOptionalString上述例子的隐式解包,在编译和运行过程中都不会产生问题,但如果在两行代码两头插入一行 implicitlyUnwrappedOptionalString = nil将会产生运行时谬误,产生解体。 ...

May 24, 2023 · 2 min · jiezi

关于swift:万字长文详解如何使用Swift提高代码质量-京东云技术团队

前言京喜APP最早在2019年引入了Swift,应用Swift实现了第一个订单模块的开发。之后一年多咱们继续在团队/公司外部推广和遍及Swift,目前Swift曾经撑持了70%+以上的业务。通过应用Swift进步了团队内同学的开发效率,同时也带来了品质的晋升,目前来自Swift的Crash的占比不到1%。在这过程中一直的学习/实际,团队内的Code Review,也对如何应用Swift来进步代码品质有更深的了解。 Swift个性在探讨如何应用Swift进步代码品质之前,咱们先来看看Swift自身相比ObjC或其余编程语言有什么劣势。Swift有三个重要的个性别离是富裕表现力/安全性/疾速,接下来咱们别离从这三个个性简略介绍一下: 富裕表现力Swift提供更多的编程范式和个性反对,能够编写更少的代码,而且易于浏览和保护。 根底类型 - 元组、Enum关联类型办法 - 办法重载protocol - 不限度只反对class、协定默认实现、类专属协定泛型 - protocol关联类型、where实现类型束缚、泛型扩大可选值 - 可选值申明、可选链、隐式可选值属性 - let、lazy、计算属性`、willset/didset、Property Wrappers函数式编程 - 汇合filter/map/reduce办法,提供更多规范库办法并发 - async/await、actor规范库框架 - Combine响应式框架、SwiftUI申明式UI框架、CodableJSON模型转换Result builder - 形容实现DSL的能力动态性 - dynamicCallable、dynamicMemberLookup其余 - 扩大、subscript、操作符重写、嵌套类型、区间Swift Package Manager - 基于Swift的包管理工具,能够间接用Xcode进行治理更不便struct - 初始化办法主动补齐类型推断 - 通过编译器弱小的类型推断编写代码时能够缩小很多类型申明提醒:类型推断同时也会减少肯定的编译耗时,不过Swift团队也在一直的改善编译速度。安全性代码平安let属性 - 应用let申明常量防止被批改。值类型 - 值类型能够防止在办法调用等参数传递过程中状态被批改。访问控制 - 通过public和final限度模块外应用class不能被继承和重写。强制异样解决 - 办法须要抛出异样时,须要申明为throw办法。当调用可能会throw异样的办法,须要强制捕捉异样防止将异样裸露到下层。模式匹配 - 通过模式匹配检测switch中未解决的case。类型平安强制类型转换 - 禁止隐式类型转换防止转换中带来的异样问题。同时类型转换不会带来额定的运行时耗费。。提醒:编写ObjC代码时,咱们通常会在编码时增加类型查看防止运行时解体导致Crash。KeyPath - KeyPath相比应用字符串能够提供属性名和类型信息,能够利用编译器查看。泛型 - 提供泛型和协定关联类型,能够编写出类型平安的代码。相比Any能够更多利用编译时查看发现类型问题。Enum关联类型 - 通过给特定枚举指定类型防止应用Any。内存平安空平安 - 通过标识可选值防止空指针带来的异样问题ARC - 应用主动内存治理防止手动治理内存带来的各种内存问题强制初始化 - 变量应用前必须初始化内存独占拜访 - 通过编译器查看发现潜在的内存抵触问题线程平安值类型 - 更多应用值类型缩小在多线程中遇到的数据竞争问题async/await - 提供async函数使咱们能够用结构化的形式编写并发操作。防止基于闭包的异步形式带来的内存循环援用和无奈抛出异样的问题Actor - 提供Actor模型防止多线程开发中进行数据共享时产生的数据竞争问题,同时防止在应用锁时带来的死锁等问题疾速值类型 - 相比class不须要额定的堆内存调配/开释和更少的内存耗费办法动态派发 - 办法调用反对动态调用相比原有ObjC音讯转发调用性能更好编译器优化 - Swift的动态性能够使编译器做更多优化。例如Tree Shaking相干优化移除未应用的类型/办法等缩小二进制文件大小。应用动态派发/办法内联优化/泛型特化/写时复制等优化进步运行时性能提醒:ObjC音讯派发会导致编译器无奈进行移除无用办法/类的优化,编译器并不知道是否可能被用到。ARC优化 - 尽管和ObjC一样都是应用ARC,Swift通过编译器优化,能够进行更快的内存回收和更少的内存援用计数治理提醒: 相比ObjC,Swift外部不须要应用autorelease进行治理。代码质量指标 以上是一些常见的代码质量指标。咱们的指标是如何更好的应用Swift编写出合乎代码质量指标要求的代码。 提醒:本文不波及设计模式/架构,更多关注如何通过正当应用Swift个性做部分代码段的重构。一些不错的实际利用编译查看缩小应用Any/AnyObject因为Any/AnyObject短少明确的类型信息,编译器无奈进行类型查看,会带来一些问题: 编译器无奈查看类型是否正确保障类型平安代码中大量的as?转换类型的缺失导致编译器无奈做一些潜在的编译优化应用as?带来的问题 当应用Any/AnyObject时会频繁应用as?进行类型转换。这如同没什么问题因为应用as?并不会导致程序Crash。不过代码谬误至多应该分为两类,一类是程序自身的谬误通常会引发Crash,另外一种是业务逻辑谬误。应用as?只是防止了程序谬误Crash,然而并不能避免业务逻辑谬误。 func do(data: Any?) { guard let string = data as? String else { return } // }do(1)do("")以下面的例子为例,咱们进行了as?转换,当data为String时才会进行解决。然而当do办法内String类型产生了扭转函数,应用方并不知道已变更没有做相应的适配,这时候就会造成业务逻辑的谬误。 提醒:这类谬误通常更难发现,这也是咱们在一次实在bug场景遇到的。应用自定义类型代替Dictionary代码中大量Dictionary数据结构会升高代码可维护性,同时带来潜在的bug: key须要字符串硬编码,编译时无奈查看value没有类型限度。批改时类型无奈限度,读取时须要反复类型转换和解包操作无奈利用空平安个性,指定某个属性必须有值提醒:自定义类型还有个益处,例如JSON转自定义类型时会进行类型/nil/属性名查看,能够防止将谬误数据丢到下一层。不举荐 let dic: [String: Any]let num = dic["value"] as? Intdic["name"] = "name"举荐 ...

May 10, 2023 · 7 min · jiezi

关于swift:iOS-预编译指令

iOS 预编译指令是否是模拟器#if targetEnvironment(simulator) print("模拟器")#else print("真机")#endif是否是DEBUG模式#if DEBUG print("DEBUG")#else print("其余")#endif

May 6, 2023 · 1 min · jiezi

关于swift:iOS代码覆盖率一全量覆盖率自动化实践

作者:京东批发 邓立兵 简介这是一个统计基于 Swift & Objective-C 工程的代码覆盖率的自动化脚本。之所以做成 Pod ,是便于更好的复用,该 Pod 只蕴含了收集生成代码覆盖率的脚本。整体比较简单不便。 这里只将流程,咱不讲原理。后续另外介绍 这里只将流程,咱不讲原理。后续另外介绍 应用1、装置:通过 CocoaPods 进行装置,在你的 Podfile 文件增加如下代码: pod 'HDCoverage' 复制代码 而后 pod install 装置下载相干脚本文件。 2、关联脚本:在我的项目的 Xcode 的 Build Phases 增加新的脚本(New Run Script Phase)(App在Build会执行该脚本): "${PODS\_ROOT}/HDCoverage/HDCoverage/hd\_coverage_env.sh" 复制代码 3、工程配置代码覆盖率参数:这里原本是在 HDCoverage 有脚本反对的,然而基于对哪些模块(Pod作为独立模版)进行代码覆盖率,所以倡议在 Podfile 自主增加如下代码灵便治理,具体阐明如下: # 实现post_install Hooks# 须要收集Code Coverage的模块ntargets = Array['AFNetworking']require 'xcodeproj'post_install do |installer| # 批改Pods中某一个模块的配置文件,好采集代码覆盖率,须要源码! installer.pods_project.targets.each do |target| target.build_configurations.each do |config| if(config.name <=> 'Release') == 0 config.build_settings['OTHER_CFLAGS'] = '$(inherited)' config.build_settings['OTHER_SWIFT_FLAGS'] = '$(inherited)' config.build_settings['OTHER_LDFLAGS'] = '$(inherited)' ntargets.each do |ntarget| if(ntarget <=> target.name) == 0 config.build_settings['OTHER_CFLAGS'] = '$(inherited) -fprofile-instr-generate -fcoverage-mapping' config.build_settings['OTHER_SWIFT_FLAGS'] = '$(inherited) -profile-generate -profile-coverage-mapping' config.build_settings['OTHER_LDFLAGS'] = '$(inherited) -fprofile-instr-generate' break end end else config.build_settings['OTHER_CFLAGS'] = '$(inherited)' config.build_settings['OTHER_SWIFT_FLAGS'] = '$(inherited)' config.build_settings['OTHER_LDFLAGS'] = '$(inherited)' end end end # 批改主工程 project_path = './HDCoverage.xcodeproj' project = Xcodeproj::Project.open(project_path) puts project project.targets.each do |target| if(target.name <=> 'HDCoverageDemo') == 0 target.build_configurations.each do |config| if ((config.name <=> 'Release') == 0 || (config.name <=> 'Debug') == 0) # 设置预编译变量CODECOVERAGE config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] = '$(inherited) CODECOVERAGE=1' # OC代码覆盖率插桩配置 config.build_settings['OTHER_CFLAGS'] = '$(inherited) -fprofile-instr-generate -fcoverage-mapping' # Swift代码覆盖率插桩配置 config.build_settings['OTHER_SWIFT_FLAGS'] = '$(inherited) -profile-generate -profile-coverage-mapping' # 采集代码覆盖率配置 config.build_settings['OTHER_LDFLAGS'] = '$(inherited) -fprofile-instr-generate' # Release须要设置,不然无奈解析代码覆盖率 config.build_settings['SWIFT_OPTIMIZATION_LEVEL'] = '-Onone' else config.build_settings['OTHER_CFLAGS'] = '$(inherited)' config.build_settings['OTHER_SWIFT_FLAGS'] = '$(inherited)' config.build_settings['OTHER_LDFLAGS'] = '$(inherited)' config.build_settings['SWIFT_OPTIMIZATION_LEVEL'] = '' end end end end project.save()end4、代码执行数据收集:应用 GCC 无奈满足 同时兼容 Swift和 Objective-C ,所以这里是基于 LLVM 进行,官网文档 。也能够参考笔者翻译的 Source-based Code Coverage ,残缺具体的教程能够看 Source-based Code Coverage for Swift Step by Step。 ...

April 4, 2023 · 2 min · jiezi

关于swift:Swift之struct二进制大小分析

作者:京东批发 邓立兵 随着Swift的日渐成熟和给开发过程带来的便利性及安全性,京喜App中的原生业务模块和根底模块应用Swift开发占比逐步增高。本次探讨的是struct比照Class的一些优劣势,重点剖析对包体积带来的影响及躲避措施。一、基础知识1、类型比照 援用类型:将一个对象赋值给另一个对象时,零碎不会对此对象进行拷贝,而会将指向这个对象的指针赋值给另一个对象,当批改其中一个对象的值时,另一个对象的值会随之扭转。【Class】 值类型:将一个对象赋值给另一个对象时,会对此对象进行拷贝,复制出一份正本给另一个对象,在批改其中一个对象的值时,不影响另外一个对象。【structs、Tuples、enums】。Swift中的【Array, String, and Dictionary】 两者的区别能够查阅Apple官网文档 2、Swift中struct和Class区别1、class是援用类型、struct是值类型2、类容许被继承,构造体不容许被继承3、类中的每一个成员变量都必须被初始化,否则编译器会报错,而构造体不须要,编译器会主动帮咱们生成init函数,给变量赋一个默认值4、当你须要继承Objective-C某些类的的时候应用class5、class申明的办法批改属性不须要`mutating`关键字;struct须要6、如果须要保证数据的唯一性,或者保障在多线程数据安全,能够应用struct;而心愿创立共享的、可变的状态应用class以上三点能够参考深刻了解Swift中的Class和Struct进行更多细节的浏览学习 二、struct优选孔子曰:择其善者而从之,其不善者而改之。1、安全性 应用struct是值类型,在传递值的时候它会进行值的copy,所以在多线程是平安的。无论你从哪个线程去拜访你的 Struct ,都非常简单。2、效率性 struct存储在stack中(这比malloc/free调用的性能要高得多),class存储在heap中,struct更快。3、内存泄露 没有援用计数器,所以不会因为循环援用导致内存透露基于这些因素,在日常开发中,咱们能用struct的咱们尽量应用struct。 三、struct的不完满孟子曰:鱼,我所欲也,熊掌亦我所欲也;二者不可得兼。“熊掌” 再好,吃多了也难以消化。特地在中大型项目中,如果没有节制的应用struct,可能会带来意想不到的问题。 1、内存问题值类型有哪些问题?比方在两个struct赋值操作时,可能会发现如下问题: 1、内存中可能存在两个微小的数组;2、两个数组数据是一样的;3、反复的复制。 解决方案:COW(copy-on-write) 机制 1、Copy-on-Write 是一种用来优化占用内存大的值类型的拷贝操作的机制。2、对于Int,Double,String 等根本类型的值类型,它们在赋值的时候就会产生拷贝。(内存减少)3、对于 Array、Dictionary、Set 类型,当它们赋值的时候不会产生拷贝,只有在批改的之后才会产生拷贝。(内存按需延时减少)4、对于自定义的数据类型不会主动实现COW,可按需实现。那么自定义的数据如何实现COW呢,能够参考官网代码: /*咱们应用class,这是一个援用类型,因为当咱们将援用类型调配给另一个时,两个变量将共享同一个实例,而不是像值类型一样复制它。*/final class Ref { var val : T init(_ v : T) {val = v}}/*创立一个struct包装Ref:因为struct是一个值类型,当咱们将它调配给另一个变量时,它的值被复制,而属性ref的实例仍由两个正本共享,因为它是一个援用类型。而后,咱们第一次更改两个Box变量的值时,咱们创立了一个新的ref实例,这要归功于:isUniquelyReferencedNonObjC这样,两个Box变量不再共享雷同的ref实例。*/struct Box { var ref : Ref init(_ x : T) { ref = Ref(x) } var value: T { get { return ref.val } set { // isKnownUniquelyReferenced 函数来查看某个引 用只有一个持有者 // 如果你将一个 Swift 类的实例传递给这个函数,并且没有其余变量强援用 这个对象的话,函数将返回 true。如果还有其余的强援用,则返回 false。不过,对于 Objective-C 的类,它会间接返回 false。 if (!isUniquelyReferencedNonObjC(&ref)) { ref = Ref(newValue) return } ref.val = newValue } }}// This code was an example taken from the swift repo doc file OptimizationTips // Link: https://github.com/apple/swift/blob/master/docs/OptimizationTips.rst#advice-use-copy-on-write-semantics-for-large-values实例阐明:咱们想在一个应用struct类型的User中应用copy-on-write的: ...

March 30, 2023 · 4 min · jiezi

关于swift:云音乐-Swift-混编-Module-化实践

图片来自:https://unsplash.com 本文作者:冰川背景云音乐 iOS App 经验多年的迭代,积攒了大量的 Objective-C(以下简称 OC) 代码,目前曾经实现主工程壳化,各层组件关系如下: 组件化后混编的场景次要集中在 Framework 内混编和 Framework 之间混编,Framework 内的混编老本较低,重头次要在 Framework 间的混编。 在云音乐中集成的翻新业务,因为依赖的历史根底库较少,曾经投入使用 Swift。主站业务迟迟没有投入,次要起因是波及到大量的 OC 业务根底库和公共根底库不反对 Swift 混编,OC 组件库参加混编的前提是要实现 Module 化。 以上是咱们实现混编打算的几个阶段,本文次要介绍在反对云音乐 Swift 混编过程中,Module 化阶段的剖析与实际。 什么是 Modules早在 2012 苹果就提出了 Modules 的概念(比 Swift 公布还要早),Module 是组件的形象形容,蕴含组件接口以及实现。它的外围目标是为了解决 C 系语言的扩展性和稳定性问题。 Cocoa 框架很早就反对了 Module,并且前向兼容,正因为它的兼容性,纯 Objective-C 开发对它的感知可能不强。 AFramework.framework├─ Headers├─ Info.plist├─ Modules│ └─ module.modulemap└─ AFrameworkModule 化的 OC 二进制 Framework 组件,在 Modules 目录下存在一个 .modulemap 格局的文件,它形容了组件对外裸露的能力。当援用的组件蕴含 modulemap,Clang 编译器会从中查找头文件,进行 Module 编译,并将编译后果缓存。 Clang 编译器要求 Swift 援用的 Objective-C 组件必须反对 Module 个性。咱们把 OC 组件反对 Module 的过程,称为 Module 化。 ...

March 6, 2023 · 3 min · jiezi

关于swift:SwiftUI模块0001-SwiftUI自定义Tabbar动画效果

SwiftUI模块系列 - 已更新23篇SwiftUI我的项目 - 已更新2个我的项目往期Demo源码下载效果图 - 自定tabbar动画成果 思路应用Table先创立一个动态的tabbar在自定义tabbar插入一个黄色的圆圈 设置偏移量是tabbar的按钮图标x的10偏移量左右监听按钮点击去触发去偏移黄色圆圈的y值即可代码ContentView.swiftstruct ContentView: View { // MARK: Hiding Native One // 暗藏Native One init(){ UITabBar.appearance().isHidden = true } @State var currentTab : Tab = .home var body: some View { VStack(spacing:0){ TabView(selection:$currentTab) { // MARK: Need to Apply BG For Each Tab View // 须要为每个标签视图利用BG Text("Home") .ApplyBG() .tag(Tab.home) Text("Label") .ApplyBG() .tag(Tab.label) Text("Position") .ApplyBG() .tag(Tab.position) Text("Found") .ApplyBG() .tag(Tab.found) Text("My") .ApplyBG() .tag(Tab.my) } CustomTabbar(currentTab: $currentTab) } }}struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() }}extension View{ func ApplyBG() -> some View { // infinity 无穷的 self .frame(maxWidth:.infinity,maxHeight: .infinity) .background{ Color("BG") .ignoresSafeArea() } }}CustomTabbar.swiftstruct CustomTabbar: View { @Binding var currentTab : Tab // MARK : To Animate Like Curve // 动画曲线 @State var yOffset : CGFloat = 0 var body: some View { GeometryReader{ proxy in // 获取整体的宽度 let width = proxy.size.width HStack(spacing:0) { ForEach(Tab.allCases,id:\.rawValue){tab in Button { withAnimation(.easeInOut(duration: 0.2)) { currentTab = tab yOffset = -60 } withAnimation(.easeInOut(duration: 0.1).delay(0.07)){ yOffset = 0 } } label: { Image(tab.rawValue) .renderingMode(.template) .resizable() .aspectRatio(contentMode: .fit) .frame(width:30,height: 30) .frame(maxWidth:.infinity) .foregroundColor(currentTab == tab ? Color("Purple"):.gray) // MARK : Little Scaling Effect // 图标一个缩放动画成果 .scaleEffect(currentTab == tab && yOffset != 0 ? 1.5 : 1) } } } .frame(maxWidth:.infinity) .background(alignment:.leading){ Circle() .fill(Color("Yellow")) .frame(width:25,height:25) .offset(x:10,y:yOffset) .offset(x:indicatorOffset(witdh: width)) } } .frame(height:30) .padding(.bottom,10) .padding([.horizontal,.top]) } // MARK: Indicator Offset // 指示器偏移 func indicatorOffset(witdh : CGFloat) ->CGFloat { let index = CGFloat(getIndex()) if index == 0 {return 0} let buttonWidth = witdh / CGFloat(Tab.allCases.count) return index * buttonWidth } func getIndex() -> Int { switch currentTab { case .home: return 0 case .label: return 1 case .position: return 2 case .found: return 3 case .my: return 4 } }}struct CustomTabbar_Previews: PreviewProvider { static var previews: some View { ContentView() }}Tab.swiftimport SwiftUI// Mark : Enum For Tabs with Rawvlaue as Asset Image// 标记:Enum选项卡与Rawvlaue作为资产图像enum Tab : String ,CaseIterable { case home = "Home" case label = "Label" case position = "Position" case found = "Found" case my = "My"}demo源码如需看源码,请点击下载! ...

September 4, 2022 · 2 min · jiezi

关于swift:wallysIPQ8074A2x4×4-or-8×8-11AX-MUMIMO-DUAL-CONCURRENT

2x(4×4 or 8×8) 11AX MU-MIMO DUAL CONCURRENT EMBEDDEDBOARDFeatures IPQ8074A 4x4 2.4G 8x8 5G 802.11ax IPQ8074A 4x4 2.4G 8x8 5G 802.11ax DR8074A(HK01) https://www.wallystech.com/Ro... MT7915/MT 7975/IPQ6000/IPQ6018/IPQ6010/IPQ4019/IPQ4029/ipq4018/IPQ8072/IPQ8074/QCN9074/QCN9072/QCN9024/IPQ5018/BY:Wallys Communications (Suzhou ) Co., LTDEMAIL:sales3@wallystech.com Wallys Communications (SuZhou) Co., Ltd., http://www.wallystech.com,which is a professional supplier specializing in product design, manufacturing and offering superior OEM/ODM/JDM services in wireless communications. As a specialized manufacturer and exporter for these products in China,We sincerely hope to establish business relations with your esteemed corporation. We mainly develop high power wireless products based on Quacomm chip such asIPQ6000/IPQ6018/IPQ6010/IPQ4019/IPQ4029/IPQ8072/IPQ8074/QCN9074 and so on . Features Qualcomm Atheros IPQ8074A AR Quad Core CPUOn-board 5GHz radio, up to 4804Mbps physical data rate 32MB NOR Flash, 256MB NAND FlashOn-board 2.4GHz radio, up to 1147Mbps physical data rateSupport 11ax TX BeamformingSupport 11ac/ax MU-MIMO DL and ULSupport OFDMA DL and ULTri-band support with 5G SBS (4×4/5GHz + 4×4/5GHz) + 4×4/2.4GHzSupports Dynamic Frequency Selection (DFS)Applications ...

June 30, 2022 · 2 min · jiezi

关于swift:Swift-57-中的-any-和-some-译

因为 any 和 some 都实用于协定,因而我想在这篇博文中将它们放在一起比拟以便更好地解释它们解决别离解决了什么问题,以及在什么状况下应用 any、some 或其余的。 理解 any 和 some 解决的问题为了解释 any 解决的问题,咱们能够通过一个列子来理解这两个关键字。上面是一个Pizza模型的协定: protocol Pizza { var size: Int { get } var name: String { get }}在Swift 5.6,你可能会写上面的这种办法,来接管一个Pizza func receivePizza(_ pizza: Pizza) { print("Omnomnom, that's a nice \(pizza.name)")}当这个函数被调用时,receivePizza 函数接管一个所谓的披萨协定类型,咱们能够了解为一个披萨盒子。为了晓得这个披萨名称,必须关上这个盒子,也就是获取实现Pizza协定的具体对象,而后获取名称。这意味着 Pizza 简直没有编译时优化,这使得 receivePizza 办法调用的开销比咱们想要的更大。 另外上面的函数,看起来如同是一样的 func receivePizza<T: Pizza>(_ pizza: T) { print("Omnomnom, that's a nice \(pizza.name)")}不过,这里有一个很次要区别。 Pizza 协定在这里没有用作参数类型。它被用作泛型 T 的束缚。这就使得编译器将可能在编译时解析 T 的类型,使得 receivePizza 承受到的是一个具体化的类型。 因为下面这两种办法差别并不是很分明,所以 Swift 团队引入了 any 关键字。此关键字不增加任何新性能。它迫使咱们分明地传播“这是一种存在主义”:(有点拗口,也不是很好了解,我就把他了解成这么类型的一个货色) ...

June 27, 2022 · 2 min · jiezi

关于swift:Swift-Learning-Summary-Access-Control

Access ControlAccess control restrict access to part of the code form code in other source files and modules. It enable us to hide the implement detail of the code, and to specify a preferred interface which that code can be accessed and used. Set access levels to individual types (classes, structures, enumerations), as well as to properties, methods, initializers, and subscripts belonging to those types. Protocols can be restricted to a certain context, as can global constants, variable, and functions. ...

June 18, 2022 · 10 min · jiezi

关于swift:swift-符号命名规则name-demangle

swift符号命名规定通过穷举法,得出以下规定 swiftc -target arm64-apple-ios8.0 -framework UIKit -emit-sil -sdk \ /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/ WXTestCell.swift

June 16, 2022 · 1 min · jiezi

关于swift:swiftc-demangle符号清洗

Swift 符号荡涤swift在crash堆栈里的信息是蛮奇怪的,比如说这种:_TtC16MTSS_SDKTestDemo13WXCrashTestVC其实他这是通过Name demangle名字命名技术之后,让人看起来诡异,如何荡涤成失常的符号呢: xcrun swift-demangle __TFV5hello4Rectg9subscriptFOS_9DirectionSi荡涤成人眼可看的符号了 说到底swift的Name demangle是抄的c++的Name demangle技术,swift的符号命名规定详见swift符号规定 oc-Swift混编 oc调用swift类的app名-Swift.h文件,这里会寄存着swift本义成oc的类的列表,如果在oc里须要通过runtime调用swift类,则须要调用本义之后的swift类名,如下图中的_TtC16MTSS_SDKTestDemo13WXCrashTestVC如何寻找编译之后的app名-Swift.h文件,找到编译日志里的swiftFileList地位就行了,和这个放在同一级目录下, C++符号荡涤c++filt -n _ZN5physx2Gu24PCMMeshContactGenerationC2ERKNS_6shdfnd3aos6FloatVES6_RKNS3_12PsTransformVES9_RNS0_33MultiplePersistentContactManifoldERNS0_13ContactBufferE一般来说c++filt命令要加-n参数,能力失常解析 参考文章:c++符号荡涤

June 14, 2022 · 1 min · jiezi

关于swift:Swift-Learning-Summary-Memory-Safety

Memory SafetyMost of the time we don’t have to think about accessing memory, but it’s important to understand where potential conflicts can occur, so we can avoid writing code that has conflicting access to memory. Here we are talking about the situation that happen on a single thread. Memory Accessvar one = 1 // write access to the memory one is stored.print("\(one)") // read access from the memory one is stored.The conflicting access to memory can occur when different part of the code are trying to access the same location in memory at the same time. ...

June 12, 2022 · 5 min · jiezi

关于swift:Swift-Learning-Summary-Automatic-Reference-Counting

Automatic Reference CountingSwift use ARC to track and manage the app’s memory usage. ARC frees up the memory used by class instances when those instances are no longer needed. Reference counting applies only to instance of classes. Reference: strong: retain the obj. (default)weak: don’t retain the object referred to, track the object referred to.unowned: don’t retain the object referred to, don’t tract the object referred to.How ARC WorkAllocate a chunk of memory to store information about that instance ...

June 12, 2022 · 6 min · jiezi

关于swift:Swift-Learning-Summary-Opaque-Type

Opaque TypeA function with an opaque type hides its return value’s type information. Hiding type information at some boundaries between a module and code that calls into the module. Unlike returning a value whose type is a protocol type, opaque type preserve type identity —the compile has access to the type information, but clients of the module don’t. The SituationHere we have a Shape protocol. protocol Shape { func draw() -> String}The struct Triangle conform to the Shape. Describe how to draw(). ...

June 5, 2022 · 4 min · jiezi

关于swift:Swift-Learning-Summary-Generic

GenericsWrite code in a more abstract way. It make the code flexible and more reusable. Array and Dictionary types are both generic collections. The Problem That Generics SolveIf the code with no generics: func swapTwoInts(_ a: inout Int, _ b: inout Int) { let tmp = a a = b b = tmp}func swapTwoStrings(_ a: inout String, _ b: inout String) { let tmp = a a = b b = tmp}func swapTwoDoubles(_ a: inout Double, _ b: inout Double) { let tmp = a a = b b = tmp}// Use the functionvar aInt = 3, bInt = 4var aString = "Mike", bString = "Amy"var aDouble = 1.1, bDouble = 2.5swapTwoInts(&aInt, &bInt)swapTwoStrings(&aString, &bString)swapTwoDoubles(&aDouble, &bDouble)print(aInt, bInt)print(aString, bString)print(aDouble, bDouble)// Print:// 4 3// Amy Mike// 2.5 1.1Once the code use generics: ...

June 5, 2022 · 7 min · jiezi

关于swift:理解-Swift-中的-inlinable-译

@inlinable 属性是 Swift 鲜为人知的属性之一。与其余同类一样,它的目标是启用一组特定的微优化,您能够应用它们来进步应用程序的性能。让咱们来看看这个是如何工作的。 在 Swift 中应用 @inline 进行内联扩大兴许最须要留神的是,尽管 @inlinable 与代码内联无关,但它与咱们之前曾经介绍过的 @inline 属性不同。然而为了防止您不得不浏览两篇文章,咱们将在介绍 @inlinable 之前再次介绍这些概念。 在编程中,内联扩大,也称为内联,是一种编译器优化技术,它用所述办法的主体替换办法调用。 调用办法的操作很难做到没有性能开销。正如咱们在对于内存调配的文章中所述,当应用程序心愿将新的堆栈跟踪推送到线程时,会进行大量的编排来传输、存储和扭转应用程序的状态。尽管从方面来说,堆栈跟踪能够简化调试过程,但您可能想晓得是否有必要每次都这样做。如果一个办法太简略,调用它的开销可能不仅是不必要的,而且对应用程序的整体性能无害: func printPlusOne(_ num: Int) { print("My number: \(num + 1)")}print("I'm going to print some numbers!")printPlusOne(5)printPlusOne(6)printPlusOne(7)print("Done!")printPlusOne 这样的办法过于简略,无奈在应用程序的二进制文件中证实残缺的定义。只是为了清晰起见,咱们在代码中定义了它,但在公布这个应用程序时最好去掉它, 用残缺的实现替换所有调用它的中央,如下所示: print("I'm going to print some number!")print("My number: \(5 + 1)")print("My number: \(6 + 1)")print("My number: \(7 + 1)")print("Done!")这种缩小办法调用开销,可能会进步应用程序的性能,但可能会减少整体包大小,具体取决于被内联的办法的大小(能够了解为替换,被替换的办法中的代码多,天然代码量就多了)。这个过程是由 Swift 编译器主动实现的,依据你工程构建时的优化级别,水平是可变的。@inline 属性能够用来疏忽优化级别,强制编译器遵循特定的方向。内联也能够用于混同。 @inlinable 的目标是什么?大多数优化,如内联,大多在外部实现。尽管能够保障本人正在开发的模块将失去适当的优化,但当咱们解决来自其余模块的调用时,事件会简单得多。 编译器优化之所以产生,是因为编译器对正在编译的内容有残缺的理解,但在构建framework时,编译器不可能晓得导入方将如何应用他。因而尽管框架的外部代码将失去优化,但公共接口很可能会不变。 咱们可能会想,咱们能够通知编译器组成framework的源信息,以便它可能从新取得framework的信息,并对其优化。但当咱们意识到该框架的导入器正在链接的是曾经编译的货色时,这会变得复杂。源文件上的所有信息都不见了,如果这是第三方框架,甚至可能一开始就没有这些源信息。(拿不到framework所有的源信息) 这不是一个不可能呈现的问题,尽管编译器有很多种解决这个问题的办法,但实质是一样的,就是让模块的公共接口在链接时蕴含更多编译器可用的信息,这样就能够进一步优化framework中的代码,不限于内联。 在实践中,你可能会留神到这样做可能会重大失控。如果咱们给公共接口的每个办法都增加信息,这样会让框架的体积增大,而且大部分都会被节约掉。咱们不晓得framework将会被如何应用,所以不能一概而论的这样操作。 Swift会让你本人决定来解决这种问题。@inlinable 属性容许您为特定办法启用跨模块内联。这样做了之后,办法的实现将作为模块公共接口的一部分来公开,容许编译器进一步优化来自不同模块的调用。 @inlinable func printPlusOne(_ num: Int) { print("My number: \(num + 1)")}如果内联办法恰好在外部调用其余办法,编译器会要求您也公开这些办法。这能够通过将它们标记为 @inlinable 或 @usableFromInline。@usableFromInline 表明尽管该办法在内联办法中应用的,但它自身并不真正应该被内联。 ...

June 2, 2022 · 1 min · jiezi

关于swift:Swift-Learning-Summary-Error-Handling

Error HandlingFirst-class support for throwing, catching, propagating, and manipulating recoverable errors at runtime. When an optional fails, it’s useful to understand what cause the failure, so that the code can respond accordingly. Example:Reading a file from the disk may be fail in some way. File not existHave no permission to read.File not being encoded in a compatible format.Distinguishing among these different situations allows a program to resolve some errors and to communicate to the user any errors it can’t resolve. ...

May 7, 2022 · 4 min · jiezi

关于swift:Swift-首次调试断点慢的问题解法-优酷-Swift-实践

作者:段继统 & 夏磊 调试断点是与开发体验关系最为亲密点之一,优酷iOS团队在内部调研时候发现,大量国内的iOS APP研发团队也遇到了相似的问题。思考到国内Swift热火朝天的现状,咱们尽快整顿了该计划并通过本文分享进去,心愿能在这个问题上帮忙到大家。前言家喻户晓,Swift是苹果公司于2014年苹果开发者年会(WWDC2014)上公布的编译式新开发语言,反对多编程范式,能够用来撰写基于macOS、iOS、iPadOS、watchOS和tvOS上的APP。对于宽广iOS开发同学来说,这也是研发将来iOS APP开发必须要把握的语言技能。Swift语言在公布后的数年里失去了飞速发展,在2019年苹果公布了Swift5.0版本并宣告Swift ABI稳固。 在Swift5.0版本的ABI稳固后,Swift正式具备了欠缺的生产研发根底,优酷iOS研发团队也开始进行优酷iOS、iPadOS版本的Swift迁徙。优酷在被阿里巴巴收买后,取得了大量团体挪动基建和中间件的反对,因而优酷iOS App在继续演变数年后,根本成为规范的大型组件化工程,由数十个垂直团队负责各自业务并行开发。其中,优酷播放详情页场景是最重要的视频内容生产场景,也率先在2020年初开始业务页面框架、播放器框架及业务模块的Swift迁徙。 2020年底,优酷iOS生产团队实现了业务页面框架和播放器框架的Swift化,这两个框架代码量较少,外部代码后果正当清晰,而且对外部依赖较少。因而在齐全Swift化后,性能上失去了晋升,并且得益于Swift的优良语法,团队开发业务需要代码行数降落,团队效力也取得了增幅。整个过程都比拟顺畅,也并未遇到显著的工程开发或者品质问题。 进入2021年后,在业务页面框架及播放器框架Swift版本的根底上,优酷iOS团队全面启动了业务层代码Swift迁徙,而在这个阶段,Swift调试断点慢的问题开始呈现并日趋严重。 在视频内容场景,外围主业务模块代码7万多行,内部依赖各种模块达200以上,在这个业务模块里,首次断点的工夫顽劣状况下能够达到180秒以上,团队研发效率被重大制约。 2022年初优酷iOS团队实现了80%以上业务代码的Swift迁徙,调试首次断点慢的问题曾经成为业务场的效率瓶颈。在外部的研发幸福感问卷调查里,97%的iOS开发同学认为调试首次断点慢是目前研发过程的最大痛点,这个问题给iOS研发同学带来的挫败感,足以打消Swift的其余劣势。因而,解决这个问题也成为优酷iOS团队年度首要指标。 调试首次断点慢景象及初步剖析Swift调试断点慢次要景象是,当Xcode工程运行起来之后,咱们进行首次断点的等待时间会特地漫长。大部分状况下,工程首次断点失效后,第二次及后续断点的等待时间都非常短暂,根本能够认为无等待时间。不过从团队外部收集的状况来看,不同Mac电脑开发设施和不同的iOS设施体现不全统一,局部同学首次断点之后进行断点的等待时间也极其迟缓。 这个景象或者说问题在团队外部频繁呈现后,咱们首先向苹果中国开发者关系团队反馈,并附上了具体的工程文档等信息。苹果方面也基于反馈在外部进行了考察和验证,并最终给咱们回答,示意外部并没有相似问题的发现。在交换过程中咱们发现,苹果外部的大型APP工程模式都是传统的单工程模式,与国内的组件化多个工程模式截然不同。基于各方面汇总信息,咱们对这个问题开始进行初步剖析和解决。 从下表中能够剖析,播放器框架模块和播放主业务模块状况联合断点工夫来看,断点工夫仿佛与内部依赖数量出现等比关系,所以能够初步判定断点工夫和内部依赖数量存在较强的相关性。 另外还有一个景象,如果子工程和壳工程所依赖SDK的module没有对齐,lldb会很快断点失效,然而打印报错信息,同时无奈po任何值。通过此景象也能够初步剖析进去,在断点时lldb对子工程依赖的module进行了扫描。 但仅仅依赖表象剖析还不够,所以后续的工作咱们从两个方向着手,第一是从播放主业务模块的解耦测试,疾速解耦播放主业务模块的内部依赖,测试耦合数量的缩小对断点工夫是否能有帮忙;第二是从lldb本身断点原理的剖析,看首次断点如此长的工夫中lldb到底在做什么动作。 通过业务模块解耦动手咱们通过删除及整顿工程依赖援用代码的形式,疾速清理内部模块依赖,最终将播放主业务模块的内部依赖降到90个左右。整顿结束后,播放主业务首次调试断点工夫也从200秒左右降到120秒左右,对团队开发艰难现状有所缓解。然而通过理论验证和利用后,咱们也发现这种依赖业务层解耦的形式是对于团队来说不可行的,根本原因有二: 1、革新老本高 播放主业务模块从200多个模块依赖降到了90多个,一方面来说说对于避免工程腐化起到了踊跃帮忙,另一方面在业务需要的压力下,研发人员须要投入了微小的精力来进行代码重构和解耦。长期来看,不同垂直业务团队面临的状况不同,将来的业务技术需要复杂度也不尽相同,这个计划是无奈做到疾速复用。从人力老本来说,这个计划只能短期进行工程治理,无奈长期坚持下去。 2、理论收益低 从取得的收益来看,播放主业务模块内部依赖升高到90多个后,咱们原来的预期是调试首次断点工夫能升高50%甚至更低,然而后果来看,在内部依赖曾经无奈解除的状况下,首次断点等待时间仍然长达120秒以上,这样的收益后果是咱们无奈承受的。因而也得进去论断,在优酷iOS这样大型组件化多工程的模式下,咱们用业务模块解耦的形式是无奈根治该问题的。 通过LLDB剖析动手通过工程治理后,咱们感觉还是应该从侧面攻克该问题,从LLDB剖析来查看根本原因并且解决。如果要剖析LLDB动手,对于工程师来说最好的方法还是查看Swift源码,跑起来看一看外部的原型机制。咱们首先依据苹果的文档将源码下载下来,而后进行配置,具体文档能够参考 How to Set Up an Edit-Build-Test-Debug Loop,一步一步的跟着做就能够。 因为Swift是依赖于LLVM,并且在其根底上做了本人的定制化开发,所以切换分支不能只切换Swift源码的,须要将LLVM一起切到对应的分支上, 保障代码同步。正好Swift提供了相应的工具来帮忙咱们切换对应分支,只须要运行Swift文件下的utils/update-checkout相干命令即可。优酷iOS团队目前应用的是Swift5.4版本,对应Xcode版本为13.2.1。 1、应用LLVM自带耗时工具 想要看到底在断点命中后,到底哪块最耗时,就须要应用工具来计算耗时,而这块LLVM有自带的工具类TimeProfiler,外面封装了计时办法,并且输入相干json文件,而后能够用chrome自带的tracing工具解析后事实相干图表 //TimeProfiler.h void timeTraceProfilerBegin(StringRef Name, StringRef Detail); void timeTraceProfilerBegin(StringRef Name, llvm::function_ref<std::string()> Detail); void timeTraceProfilerEnd();2、耗时最多的两个中央 通过TimeProfiler对要害函数进行耗时埋点,发现有两个函数耗时较多,如下代码: // SwiftASTContext.cppbool SwiftASTContext::GetCompileUnitImportsImpl( SymbolContext &sc, lldb::StackFrameWP &stack_frame_wp, llvm::SmallVectorImpl<swift::AttributedImport<swift::ImportedModule>> *modules, Status &error)// SymbolFileDWARF.cppvoid SymbolFileDWARF::FindTypes( ConstString name, const CompilerDeclContext &parent_decl_ctx, uint32_t max_matches, llvm::DenseSet<lldb_private::SymbolFile *> &searched_symbol_files, TypeMap &types)一个是SwiftASTContext类的GetCompileUnitImportsImpl办法,这个办法次要是解析以后编译单元与Module相干的操作,另一个则是在某一个变量如果是Any类型,则须要对其进行解析,找到其类型相干的操作,而最终这两个函数的操作都与以后工程的二进制依赖剖析有关系,所以,如果能缩小在断点命中后对依赖的剖析,那么断点工夫就会越快。 ...

May 6, 2022 · 2 min · jiezi

关于swift:Swift-Learn-Summary-Strings-and-Characters

Strings and CharactersString type is bridged with Foundation’s NSString. Foundation extends String to expose methods defines by NSString. If import Foundation, you can access those NSString methods on String without casting. String Literals// "Hello World!" is a String literal. let sentence = "Hello World!"// Multilinelet story = """There are some people in the room.They are having a party.Because today is the Christmas."""// every line has the line breaks.// the start and end sign(""") must take a single line.// backslash(\), it means that the string is not broken. Then line breaks not to be part of the string's value.let content = """In a happy atmos\phere. We start the conversation"""print(content) // result: In a happy atmosphere. We start the conversation.// Alignment of quotation marks in the multiline string.let desc = """ Ha it's so funny."""print(desc) // result: Ha its so funny.let desc = """ Ha it's so funny. """print(desc) // result: Ha its so funny.let desc = """ Ha it's so funny. """print(desc) // result: Ha its so funny.Special Character in String Literals ...

March 20, 2022 · 6 min · jiezi

关于swift:Swift-Learning-Summary-Basic-Operator

Basic OperatorsTerminologyUnary operator (such as -a)Binary operator(such as 2 + 3)Ternary operator(such as a ? b : c)The values that operators affect are operands. Prefix, infix, suffix Assignment Operator // Assignmentlet b = 10var a = 5a = b// tuple assignmentlet (x, y) = (1, 2)// not allowed, it is to prevent miss use when the equal operator(==) is actually intended.if x = y { // This isn't valid, because x = y doesn't return a value.}Arithmetic Operators ...

March 19, 2022 · 3 min · jiezi

关于swift:Swift-Learning-Summary-Basics

BasicSyntax // variablevar number = 6var title : String?// const value, should be initialized before use it, can't be changed after its definitionlet speed = 200 let name : String? = nilBase data typeTypeDescUInt8UInt8.min is 0, UInt8.max is 255IntOn the 32-bit platform, it’s as Int32; On the 64-bit platform, it’s as Int64.UintOn the 32-bit platform, it’s as UInt32; On the 64-bit platform, it’s as UInt64.Double64-bit floating-point numberFloat32-bit floating-point numberBooleantrue or falseNumeric ...

March 12, 2022 · 8 min · jiezi

关于swift:Swift-之父正式退出-Swift-核心团队这只是在浪费我的时间

近日,swift 发布公告发表其外围团队目前正在思考重组我的项目的领导层,以便于更多的社区成员积极参与该项目标治理。 同时,此布告证实了“ Swift 之父、LLVM 我的项目创始人 Chris Lattner 将来到外围团队”一事,并示意 Chris Lattner 已于去年中断工作,并决定来到外围团队,将工夫集中在其余我的项目上。 布告收回后,ChrisLattner在帖子中表明其来到 Swift 外围团队和 Swift Evolution 社区的起因并不简略。 Chris Lattner 于五年前来到苹果,尔后他做过特斯拉主动驾驶软件VP、谷歌Tensorflow基础设施主管、SiFive工程总裁。他在帖子中说到本人总是很忙,但Swift对他而言十分重要,所以他违心破费大量工夫来改良和推动它,他保持每周加入例会、参加社区探讨,也亲自编写和迭代了许多代码。 正因为此,作出来到 Swift的决定对Chris Lattner来说才显得尤为艰巨。 他示意来到外围团队的根本原因是会议自身的“有毒环境”。 而减速他来到的导火索是去年夏天的一次特定会议:在通过 WebEx 被羞辱和呼啸之后(这种状况并不是第一次,也不只是一个外围团队成员),他决定劳动一下。 去年秋天,他促使领导层与他探讨了这一状况;但在防止解决这一问题后,他们找了借口并明确示意他们不打算对此采取任何口头。 因而,他决定来到。 此外,Chris Lattner 认为本人以及一些社区成员的想法曾经越来越不受器重,甚至被外围团队所漠视;且团队透明性也呈现了肯定的问题。 “我只是在节约我的工夫。我不认为我的感觉在这里是举世无双的。” Chris Lattner 认为他曾经不对 Swift 产生影响了,他所关怀的一些设计前提(比方"simple things that compose")仿佛不再风行了。 而且除了 Swift 之外,他还有很多其余的趣味,也不不足能够花工夫的货色。他表明本人是那种总是向前看的人,所以尽管这种状况很让他惆怅,但他曾经信心向前看了。 最初,Chris Lattner 示意“一个衰弱和容纳的社区将持续有利于 Swift 的设计和进化”。

February 23, 2022 · 1 min · jiezi

关于swift:Swift-在手淘商品评价的技术重构与实践

作者:王浙剑(柘剑) 手淘新版商品评估列表在经验一个半月的技术重构,几个月的迭代和放量,最终在 2021 年的双十一上,以 100% 的流量稳固的跑完了整个过程。咱们不仅在业务上有了比拟明确的晋升,同时还积淀了不少技术摸索,比方积淀基于 DinamicX + 事件链编排的轻模式研发框架、推动原生语言升级成 Swift/Kotlin,最终使得整体研发效率和稳定性有一个比拟大的晋升。(注:DinamicX 为外部自研动态化 UI 框架) 这篇文章,我会重点议论对于 Swift 的局部。如果你想理解对于 Swift 如何晋升研发效率/品质、现有我的项目/模块是否须要 Swift 作为原生语言如何选型、在商品评估落地 Swift 过程中咱们遇到了哪些问题以及最初有哪些收益和论断的一些问题,心愿这篇文章能够给你带来一些帮忙。 首先是,我为什么会抉择学习 Swift? 技术改革,将来已来因为,我心田非常动摇,相比拟于 OC,Swift 更能承载将来。 刚强后盾最次要的起因就是它有一个刚强的后盾,Swift 作为 Apple 将来最重要的开发语言,光对外输入的 WWDC 内容就曾经高达 73 个,包含但不限于语法、设计、性能、开发工具链等,具体内容如图所示: 回过头来看 Swift 这几年的倒退,从 2014 年开始正式对外公布,到当初曾经经验了 7 个年头了,在整个过程中,Apple 投入了大量精力建设 Swift,尤其是 Swift Only 框架的呈现,也意味着 Apple 正在踊跃提倡各位投入到 Swift 开发中来。 三大劣势其次,Swift 有三个比拟明确的劣势: 更快、更平安且更具备表白性。 更快 是指 Swift 在执行效率上做了很多优化。比方,Swift 零碎库自身就采纳了很多不须要援用计数的根底类型,无论是内存调配大小、援用计数损耗、办法派发动态剖析等方面的问题都失去了一个无效的晋升。具体细节这里就不开展剖析,感兴趣的能够移步 Understanding Swift Performance 理解细节。 所谓的 平安 不等于不产生 Crash,而是指任何的输出都有一个比拟明确的体现定义。Swift 设计初衷是心愿开发者无需任何不平安的数据结构就能编写代码,因而 Swift 领有一个非常强壮的类型零碎,开发者简直不须要思考指针的问题,就能实现所有的开发工作。同时还提供了一系列前缀为 Unsafe 的类型或函数,用于与不平安语言(例如 C 语言)的高性能交互、操作原始内存等绝对不平安的操作,一方面以 Unsafe 警觉开发者应用这些 API ,另外一方面是辨别类型以保障大部分开发场景应用的都是平安的类型。 ...

January 6, 2022 · 9 min · jiezi

关于swift:httplxgongxuanwangcomsszt4htm

pub 等标识前面紧跟着的是密钥的加密算法,例如 rsa3072 示意密钥长度为 3072 位的 RSA 算法。以后版本 (2.2.19) 遴选公务员应用 gpg --gen-key 生成的默认密钥应用的就是 3072 位的 RSA 算法。反对的其余算法能够输出 gpg --version 查看。留神这里指的是非对称加密的算法,对称加密应用的算法能够在每次加密时通过参数指定不同算法。 如果想要生成其余算法的主密钥,能够应用 gpg --full-gen-key 命令。这里也体现了应用子密钥的灵活性,例如咱们能够应用 4096 位的主密钥,更加平安。而后应用 3072 位的子密钥用于加密和签名,更加高效。如果将来 3072 位密钥不够平安时,只须要从新生成 4096 位的子密钥,而不必从新生成主密钥。http://lx.gongxuanwang.com/ss... 须要留神信赖和有效性不肯定有关系。遴选公务员信赖示意的是对这个密钥签名其余密钥的信赖水平,而有效性是对这个密钥自身的验证。例如我晓得某个密钥的确是特朗普的,他是无效的。但我感觉这个人满嘴跑火车,他签名的其余密钥我一律不认。http://lx.gongxuanwang.com/

November 29, 2021 · 1 min · jiezi

关于swift:智汀家庭云iOS端业务功能场景篇

【1】增加场景创立场景:EditSceneViewController.swift private func createScene() { guard let name = inputHeader.textField.text else { return } if name == "" { showToast(string: "场景名称不能为空".localizedString) return } if scene.scene_conditions.count == 0 { showToast(string: "请先增加条件".localizedString) return } if scene.scene_tasks.count == 0 { showToast(string: "请先增加执行工作".localizedString) return } scene.name = name /// 执行条件 if scene.scene_conditions.first?.condition_type == 0 { // 手动 scene.auto_run = false } else { // 主动 scene.auto_run = true if self.conditionHeader.conditionRelationshipType == .all { // 满足所有条件 scene.condition_logic = 1 } else { // 满足任一条件 scene.condition_logic = 2 } if scene.time_period == nil { scene.time_period = 1 let format = DateFormatter() format.dateStyle = .medium format.timeStyle = .medium format.dateFormat = "yyyy:MM:dd HH:mm:ss" if let startTime = format.date(from: "2000:01:01 00:00:00")?.timeIntervalSince1970 { scene.effect_start_time = Int(startTime) } if let endTime = format.date(from: "2000:01:02 00:00:00")?.timeIntervalSince1970 { scene.effect_end_time = Int(endTime) } scene.repeat_type = 1 scene.repeat_date = "1234567" } } /// 申请接口 saveButton.selectedChangeView(isLoading: true) ApiServiceManager.shared.createScene(scene: scene.transferedEditModel) { [weak self] response in self?.showToast(string: "创立胜利".localizedString) self?.navigationController?.popViewController(animated: true) } failureCallback: { [weak self] (code, err) in self?.showToast(string: err) self?.saveButton.selectedChangeView(isLoading: false) }}【2】场景管制场景的管制,包含手动场景的执行、主动场景的开启/敞开。 ...

October 9, 2021 · 2 min · jiezi

关于swift:swift-第二节课学习笔记-字符串连接

var i = 200var str = "Hello"str = str + "World"str = "\(str),asdhjdh,\(i)"print(str)输入后果HelloWorld,asdhjdh,200请按任意键持续. . .

August 27, 2021 · 1 min · jiezi

关于swift:swift-学习第一节课

第一步 关上xcode creat workspace 创立一个工作空间第二步 create project 创立一个我的项目 import Foundationprinln("Hello,World!")应用commad + R运行 也能够用上面图片的三角符号 输入

August 26, 2021 · 1 min · jiezi

关于swift:2021Swift参数及泛型参数参考

本节波及泛型类型、泛型函数以及泛型结构器的参数,包含形参和实参。申明泛型类型、函数或结构器时,须指定相应的类型参数。类型参数相当于一个占位符,当实例化泛型类型、调用泛型函数或泛型结构器时,就用具体的类型实参代替之。 对于 Swift 语言的泛型概述,见泛型(第二局部第22章)。 泛型形参语句泛型形参语句指定泛型类型或函数的类型形参,以及这些参数的关联束缚和要求。泛型形参语句用尖括号(<>)包住,并且有以下两种模式: 1. <generic parameter list> <generic parameter list where requirements > 1. <generic parameter list> <generic parameter list where requirements > 泛型形参列表中泛型形参用逗号离开,每一个采纳以下模式: 1. type parameter : constrain 泛型形参由两局部组成:类型形参及其后的可选束缚。类型形参只是占位符类型(如T,U,V,KeyType,ValueType等)的名字而已。你能够在泛型类型、函数的其余部分或者结构器申明,以及函数或结构器的签名中应用它。束缚用于指明该类型形参继承自某个类或者恪守某个协定或协定的一部分。例如,在上面的泛型中,泛型形参T: Comparable示意任何用于代替类型形参T的类型实参必须满足Comparable协定。 1. func simpleMin<T: COmparable>(x: T, y: T) -> T {2. if x < y {3. return y4. }5. return x6. } 如,Int和Double均满足Comparable协定,该函数承受任何一种类型。与泛型类型相同,调用泛型函数或结构器时不须要指定泛型实参语句。类型实参由传递给函数或结构器的实参推断而出。 1. simpleMin(17, 42)2. // T is inferred to be Int3. simpleMin(3.14159, 2.71828)4. // T is inferred to be Double 材料收录处Where语句要想对类型形参及其关联类型指定额定要求,能够在泛型形参列表之后增加where语句。where语句由关键字where及其后的用逗号宰割的多个要求组成。 ...

July 27, 2021 · 1 min · jiezi

关于swift:swift项目取消Mainstoryboard文件使用纯代码启动

1.删除Main.storyboard文件2.删除General里Deployment info中的Main interface配置项里的"Main"3.SceneDelegate是用来在iPad上做分屏应用的, 个别开发手机app的话能够间接删除4.删除AppDelegate中的configurationForConnecting和didDiscardSceneSessions办法, 这两个办法是用来设置AppDelegate代理给SceneDelegate用的5.删除info.plist中的Application Scene Manifest配置项done! $ cmd + R运行我的项目看成果

July 14, 2021 · 1 min · jiezi

关于swift:Swift-UI项目调用core-data

一. 前言这篇文章是我写的第一篇Swift UI相干的笔记吧。 这真的难搞哦,毕竟新进去的。国内文档真的是少之又少,国外的文档也真不多,根本搜进去的都是UIKit的。官网文档,也是一言难尽,根本就处于,我要实现一个性能,而后去搜一下各种帖子,筛选掉无用的帖子,找到有用的点,当然也是时常基本找不到有用的帖子,而后就要去油管上看各种教程,而后发现:哦!原来还有这个办法!接着去官网文档搜一下,看一下属性,本人调用调用...... 光是这个core data我就折腾了近一周,最初发现,原来还是官网好呀..... 吐槽一下自学swift ui,当初进入正题了。 core data呢,是苹果官网的本地数据库,然而其存储的文件其实是sqlite文件。其能够通过icloud实现备份和同步,当然icloud我会额定写一篇文档来具体讲述的(又是一把辛酸泪...)。 二. 环境如下是我以后的环境: 零碎:macOS Big Sur 11.4Xcode:Version 12.5 (12E262)Swift:5.4三. 操作步骤1. 创立我的项目在创立我的项目的时候,能够间接抉择Use Core Data选项,xcode会间接在ContentView.swift中生成一个相干demo。 2. 查看相干文件创立之后,查看文件目录,绝对于不抉择Use Core Data,会多出如下几个文件: <Your-Project-Name>.xcdatamodeIdPersistence.swift3. 创立core data表点击<Your-Project-Name>.xcdatamodeId文件,进入页面。 能够看到页面内有默认的CONFIGURATIONS为Default,默认的ENITITIES为Item,能够了解为别离对应sql中的库和表。 而后点击Item,能够看到其字段,有默认的timestamp字段。 若要新增ENTITIES(表),点击底部的Add Entity按钮即可。 若要新增Attributes(字段),点击右侧Attributes中的+即可,留神字段要抉择类型。 比方,此处以默认的Item为例,新增username和age两个字段。 4. 代码层面操作core data1)查看@Environment(\.managedObjectContext) private var viewContext@FetchRequest( sortDescriptors: [NSSortDescriptor(keyPath: \Item.timestamp, ascending: true)], animation: .default)private var items: FetchedResults<Item>// body中便当items即可2)新增private func addItem() { withAnimation { let newItem = Item(context: viewContext) newItem.timestamp = Date() do { try viewContext.save() } catch { // Replace this implementation with code to handle the error appropriately. // fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. let nsError = error as NSError fatalError("Unresolved error \(nsError), \(nsError.userInfo)") } }}如上是xcode主动生成的新增函数,若是要自定义增加字段能够这样改变下: ...

June 7, 2021 · 3 min · jiezi

关于swift:Swift循环

有的时候,咱们可能须要屡次执行同一块代码。个别状况下,语句是按程序执行的:函数中的第一个语句先执行,接着是第二个语句,依此类推。 编程语言提供了更为简单执行门路的多种控制结构。 循环语句容许咱们屡次执行一个语句或语句组,上面是大多数编程语言中循环语句的流程图: 循环类型Swift 语言提供了以下几种循环类型。点击链接查看每个类型的详细描述: 循环类型形容for-in遍历一个汇合外面的所有元素,例如由数字示意的区间、数组中的元素、字符串中的字符。语法:for index in var { 循环体 }for 循环该循环形式在 Swift 3 中曾经弃用。while 循环运行一系列语句,如果条件为true,会反复运行,直到条件变为false。语法:while condition { statement(s) } 其余的不罕用循环管制语句循环管制语句扭转你代码的执行程序,通过它你能够实现代码的跳转。Swift 以下几种循环管制语句: 管制语句形容continue 语句通知一个循环体立即进行本次循环迭代,从新开始下次循环迭代。break 语句中断以后循环。fallthrough 语句如果在一个case执行完后,继续执行上面的case,须要应用fallthrough(贯通)关键字。

April 9, 2021 · 1 min · jiezi

关于swift:Swift-条件语句

Swift 条件语句条件语句通过设定的一个或多个条件来执行程序,在条件为真时执行指定的语句,在条件为 false 时执行另外指定的语句。 能够通过下图来简略理解条件语句的执行过程: Swift 提供了以下几种类型的条件语句: 语句形容if 语句if 语句 由一个布尔表达式和一个或多个执行语句组成。if...else 语句if 语句 后能够有可选的 else 语句, else 语句在布尔表达式为 false 时执行。if...else if...else 语句if 后能够有可选的 else if...else 语句, else if...else 语句罕用于多个条件判断。内嵌 if 语句你能够在 if 或 else if 中内嵌 if 或 else if 语句。switch 语句switch 语句容许测试一个变量等于多个值时的状况。? : 运算符咱们曾经在后面的章节中解说了 条件运算符 ? :,能够用来代替 if...else 语句。它的个别模式如下: Exp1 ? Exp2 : Exp3;其中,Exp1、Exp2 和 Exp3 是表达式。请留神,冒号的应用和地位。 ? 表达式的值是由 Exp1 决定的。如果 Exp1 为真,则计算 Exp2 的值,后果即为整个 ? 表达式的值。如果 Exp1 为假,则计算 Exp3 的值,后果即为整个 ? 表达式的值。 ...

April 2, 2021 · 1 min · jiezi

关于swift:Swift输入

Swift 根本输出如果要在Swift中从用户那里获取输出,则必须在不应用UIKit框架的状况下能力在Xcode Playground中进行输出。 然而,应用Swift框架,您能够在Xcode中创立一个命令行应用程序,以从用户那里获取输出。 这是您能够用来获取用户输出的代码。 示例:应用readLine()从用户那里获取输出示例 print("请输入您最喜爱的编程语言", terminator: ".")let name = readLine()print("您最喜爱的编程语言是 \(name!).")运行该程序时,输入为: 请输入您最喜爱的编程语言.Swift您最喜爱的编程语言是 Swift.在上述程序中,打印函数输入请输入您喜爱的编程语言。在调试区域。语句 let name = readLine() 期待用户在调试区域中输出。 如果键入“ Swift”并按Enter,则readLine函数会将字符串调配给常量 name 并将其显示为 您最喜爱的编程语言是Swift。 因为 readLine 函数返回一个可选字符串,因而咱们像 name! 申明中一样强行解开了常量print("Your favorite programming language is (name!)")。 因为readLine函数返回一个可选字符串,因而在语句print(“您最喜爱的编程语言是(name!)”)中,咱们强制将常量解包为 name!

March 29, 2021 · 1 min · jiezi

关于swift:Swift-常量

常量一旦设定,在程序运行时就无奈扭转其值。 常量能够是任何的数据类型如:整型常量,浮点型常量,字符常量或字符串常量。同样也有枚举类型的常量: 常量相似于变量,区别在于常量的值一旦设定就不能扭转,而变量的值能够随便更改。 常量申明常量应用关键字 let 来申明,语法如下: let constantName = <initial value>以下是一个简略的 Swift 程序中应用常量的实例: import Cocoalet constA = 42print(constA)以上程序执行后果为: 42类型标注当你申明常量或者变量的时候能够加上类型标注(type annotation),阐明常量或者变量中要存储的值的类型。如果要增加类型标注,须要在常量或者变量名前面加上一个冒号和空格,而后加上类型名称。 var constantName:<data type> = <optional initial value>以下是一个简略是实例演示了 Swift 中常量应用类型标注。须要留神的是常量定义时必须初始值: import Cocoalet constA = 42print(constA)let constB:Float = 3.14159print(constB)以上程序执行后果为: 423.14159常量命名常量的命名能够由字母,数字和下划线组成。 常量须要以字母或下划线开始。 Swift 是一个辨别大小写的语言,所以字母大写与小写是不一样的。 常量名也能够应用简略的 Unicode 字符,如下实例: import Cocoalet _const = "Hello, Swift!"print(_const)let 你好 = "你好世界"print(你好)以上程序执行后果为: Hello, Swift!你好世界常量输入变量和常量能够应用 print(swift 2 将 print 替换了 println) 函数来输入。 在字符串中能够应用括号与反斜线来插入常量,如下实例: import Cocoalet name = "Apple"let site = "http://www.apple.com.cn"print("\(name)的官网地址为:\(site)")以上程序执行后果为: ...

March 23, 2021 · 1 min · jiezi

关于swift:Swift-可选Optionals类型

Swift 的可选(Optional)类型,用于解决值缺失的状况。可选示意"那儿有一个值,并且它等于 x "或者"那儿没有值"。 Swfit语言定义后缀?作为命名类型Optional的简写,换句话说,以下两种申明是相等的: var optionalInteger: Int?var optionalInteger: Optional<Int>在这两种状况下,变量 optionalInteger 都是可选整数类型。留神,在类型和 ?之间没有空格。 Optional 是一个含有两种状况的枚举,None 和 Some(T),用来示意可能有或可能没有值。任何类型都能够明确申明为(或者隐式转换)可选类型。当申明一个可选类型的时候,要确保用括号给 ? 操作符一个适合的范畴。例如,申明可选整数数组,应该写成 (Int[])? 写成 Int[]? 会报错。 当你申明一个可选变量或者可选属性的时候没有提供初始值,它的值会默认为 nil。 可选项遵循 LogicValue 协定,因而能够呈现在布尔环境中。在这种状况下,如果可选类型T?蕴含类型为T的任何值(也就是说它的值是 Optional.Some(T) ),这个可选类型等于 true,反之为 false。 如果一个可选类型的实例蕴含一个值,你能够用后缀操作符 !来拜访这个值,如下所示: optionalInteger = 42optionalInteger! // 42应用操作符!去获取值为nil的可选变量会有运行时谬误。 你能够用可选链接和可选绑定选择性执行可选表达式上的操作。如果值为nil,任何操作都不会执行,也不会有运行报错。 让咱们来具体看下以下实例来理解 Swift 中可选类型的利用: import Cocoavar myString:String? = nilif myString != nil { print(myString)}else{ print("字符串为 nil")}以上程序执行后果为: 字符串为 nil可选类型相似于Objective-C中指针的nil值,然而nil只对类(class)有用,而可选类型对所有的类型都可用,并且更平安。 强制解析当你确定可选类型的确蕴含值之后,你能够在可选的名字前面加一个感叹号(!)来获取值。这个感叹号示意"我晓得这个可选有值,请应用它。"这被称为可选值的强制解析(forced unwrapping)。 实例如下: import Cocoavar myString:String?myString = "Hello, Swift!"if myString != nil { print(myString)}else{ print("myString 值为 nil")}以上程序执行后果为: ...

March 23, 2021 · 1 min · jiezi

关于swift:Swift-变量

======== 变量是一种使用方便的占位符,用于援用计算机内存地址。 Swift 每个变量都指定了特定的类型,该类型决定了变量占用内存的大小,不同的数据类型也决定可存储值的范畴。 上一章节咱们曾经为大家介绍了根本的数据类型,包含整形Int、浮点数Double和Float、布尔类型Bool以及字符串类型String。此外,Swift还提供了其余更弱小数据类型, Optional, Array, Dictionary, Struct, 和 Class 等。 接下来咱们将为大家介绍如何在 Swift 程序中申明和应用变量。 变量申明变量申明意思是通知编译器在内存中的哪个地位上为变量创立多大的存储空间。 在应用变量前,你须要应用 var 关键字申明它,如下所示: var 变量名 = 初始值 以下是一个 Swift 程序中变量申明的简略实例: import Cocoavar varA = 42print(varA)var varB:FloatvarB = 3.14159print(varB) 以上程序执行后果为: 423.14159 变量命名变量名能够由字母,数字和下划线组成。 变量名须要以字母或下划线开始。 Swift 是一个辨别大小写的语言,所以字母大写与小写是不一样的。 变量名也能够应用简略的 Unicode 字符,如下实例: import Cocoavar _var = "Hello, Swift!"print(_var)var 你好 = "你好世界"var Apple = "www.apple.com.cn"print(你好)print(Apple) 以上程序执行后果为: Hello, Swift!你好世界www.apple.com.cn 变量输入变量和常量能够应用 print(swift 2 将 print 替换了 println) 函数来输入。 在字符串中能够应用括号与反斜线来插入变量,如下实例: import Cocoavar name = "苹果"var site = "http://www.apple.com.cn"print("(name)的官网地址为:(site)") ...

March 21, 2021 · 1 min · jiezi

关于swift:Swift-数据类型

========== 在咱们应用任何程序语言编程时,须要应用各种数据类型来存储不同的信息。 变量的数据类型决定了如何将代表这些值的位存储到计算机的内存中。在申明变量时也可指定它的数据类型。 所有变量都具备数据类型,以决定可能存储哪种数据。 内置数据类型Swift 提供了十分丰盛的数据类型,以下列出了罕用了几种数据类型: Int一般来说,你不须要专门指定整数的长度。Swift 提供了一个非凡的整数类型Int,长度与以后平台的原生字长雷同: 在32位平台上,Int和Int32长度雷同。在64位平台上,Int和Int64长度雷同。除非你须要特定长度的整数,一般来说应用Int就够了。这能够进步代码一致性和可复用性。即便是在32位平台上,Int能够存储的整数范畴也能够达到-2,147,483,648~2,147,483,647,大多数时候这曾经足够大了。 UIntSwift 也提供了一个非凡的无符号类型UInt,长度与以后平台的原生字长雷同: 在32位平台上,UInt和UInt32长度雷同。在64位平台上,UInt和UInt64长度雷同。留神: 尽量不要应用UInt,除非你真的须要存储一个和以后平台原生字长雷同的无符号整数。除了这种状况,最好应用Int,即便你要存储的值已知是非负的。对立应用Int能够进步代码的可复用性,防止不同类型数字之间的转换,并且匹配数字的类型推断。整数类型须要留神以下几点: 在 32 位零碎上, Int 和 Int32 长度雷同。在 64 位零碎上, Int 和 Int64 长度雷同。在 32 位零碎上, UInt 和 UInt32 长度雷同。在 64 位零碎上, UInt 和 UInt64 长度雷同。Int8, Int16, Int32, Int64 别离示意 8 位, 16 位, 32 位, 和 64 位的有符号整数模式。UInt8, UInt16, UInt32, UInt64 别离示意 8 位, 16 位, 32 位 和 64 位的无符号整数模式。浮点数:Float、Double浮点数是有小数局部的数字,比方 3.14159,0.1 和 -273.15。 浮点类型比整数类型示意的范畴更大,能够存储比 Int 类型更大或者更小的数字。Swift 提供了两种有符号浮点数类型: ...

March 21, 2021 · 2 min · jiezi

关于swift:Swift-基本语法

========== 在上一章节中咱们曾经讲到如何创立 Swift 语言的 "Hello, World!" 程序。当初咱们来温习下。 如果创立的是 OS X playground 须要引入 Cocoa : import Cocoa / 我的第一个 Swift 程序 / var myString = "Hello, World!" print(myString) 如果咱们想创立 iOS playground 则须要引入 UIKit : import UIKit var myString = "Hello, World!" print(myString) 执行以上程序,输入后果为: Hello, World! 以上代码即为 Swift 程序的根本构造,接下来咱们来具体阐明构造的组成部分。 Swift 引入咱们能够应用 import 语句来引入任何的 Objective-C 框架(或 C 库)到 Swift 程序中。例如 import cocoa 语句导入了应用了 Cocoa 库和API,咱们能够在 Swift 程序中应用他们。 Cocoa 自身由 Objective-C 语言写成,Objective-C 又是 C 语言的严格超集,所以在 Swift 利用中咱们能够很简略的混入 C 语言代码,甚至是 C++ 代码。 ...

March 21, 2021 · 2 min · jiezi

关于swift:Swift-环境搭建

========== Swift是一门开源的编程语言,该语言用于开发OS X和iOS应用程序。 在正式开发应用程序前,咱们须要搭建Swift开发环境,以便更好敌对的应用各种开发工具和语言进行疾速利用开发。因为Swift开发环境须要在OS X零碎中运行,因而其环境的搭建将不同于Windows环境,上面就一起来学习一下swift开发环境的搭建办法。 胜利搭建swift开发环境的前提: 必须领有一台苹果电脑。因为集成开发环境XCode只能运行在OS X零碎上。电脑系统必须在OS 10.9.3及以上。电脑必须装置Xcode集成开发环境。Swift 开发工具Xcode下载Swift 开发工具官网地址:https://developer.apple.com/xcode/download/。 Swift 源代码下载:https://swift.org/download/#latest-development-snapshots 下载实现后,双击下载的 dmg 文件装置,装置实现后咱们将 Xcode 图标踢挪动到利用文件夹。 你也能够在 App Store 中搜寻 xcode 装置,如下图所示: 第一个 Swift 程序Xcode 装置实现后,咱们就能够开始编写 Swift 代码了。 接下来咱们在利用文件夹关上 Xcode,关上后在屏幕顶部抉择 File => New => Playground。 接着 为 playground 设置一个名字并抉择 iOS 平台。 Swift 的 playground 就像是一个可交互的文档,它是用来练手学swift的,写一句代码出一行后果(右侧),能够实时查看代码后果,是学习swift语言的利器! 以下是 Swift Playground 窗口默认的代码: import UIKitvar str = "Hello, playground" 如果你想创立 OS x 程序,须要导入 Cocoa 包 import Cocoa 代码如下所示: ...

March 21, 2021 · 1 min · jiezi

关于swift:Mac系统上学习Swift第1节认识Swift

Swift 是一种反对多编程范式和编译式的开源编程语言,苹果于2014年WWDC(苹果开发者大会)公布,用于开发 iOS,OS X 和 watchOS 应用程序。 Swift 联合了 C 和 Objective-C 的长处并且不受 C 兼容性的限度。 Swift 在 Mac OS 和 iOS 平台能够和 Object-C 应用雷同的运行环境。 2015年6月8日,苹果于WWDC 2015上发表,Swift将凋谢源代码,包含编译器和规范库。第一个 Swift 程序 第一个 Swift 程序当然从输入 "Hello, World!" 开始,代码如下所示: 实例/ 我的第一个 Swift 程序 / var myString = "Hello, World!" print(myString) 实例解析 var myString = "Hello, World!" : 应用 var 关键字定义一个变量 myString,值为 Hello, World!print : 输入变量的值*相干材料Swift 官网手册

March 20, 2021 · 1 min · jiezi

关于swift:3个关于SwiftUI中TextField不得不看的知识点

简直每一个iOS App都须要解决用户交互,输入框作为获取用户输出内容的最罕用控件之一是开发者常常用到的一个控件。这篇文章咱们来看一下在iOS14中怎么应用全新的SwiftUI框架来解决TextField。 到公众号【iOS开发栈】学习更多SwiftUI、iOS开发相干内容。SwiftUI创立一个根底的TextFieldstruct ContentView: View { @State private var aStr = "" var body: some View { VStack { TextField("公众号<iOS开发栈>", text: $aStr) Text(aStr) } }}创立一个TextField须要两个参数,一个占位符和一个Bind<Binding<String。 TextFieldStyle通过设置textFieldStyle能够批改TextField的展示款式,在SwiftUI中零碎自带了UIKit框架中的几个款式:DefaultTextFieldStyle/PlainTextFieldStyle/RoundedBorderTextFieldStyle。 设置的办法是: TextField("公众号<iOS开发栈>", text: $aStr) .textFieldStyle(DefaultTextFieldStyle())如果零碎自带的这三种款式都不能满足需要,也能够自定义TextField的款式TextField文本对齐形式在SwiftUI中设置TextField的文本对齐形式应用的modifier是multilineTextAlignment,其中蕴含leading/center/trailing三种对齐形式。 应用这个modifier的办法如下: TextField("公众号<iOS开发栈>", text: $aStr) .multilineTextAlignment(.trailing)到公众号【iOS开发栈】学习更多SwiftUI、iOS开发相干内容。总结这篇文章对SwiftUI框架中的TextFiled控件进行了解说,次要波及了创立办法、批改展现款式和设置文本对齐办法三个方面,心愿对你有所帮忙。

March 1, 2021 · 1 min · jiezi

关于swift:京东App-Swift-混编及组件化落地

背景自 Swift 诞生以来,逐渐见证其从饱受诟病到日渐欠缺。在苹果的全力推动下,耳濡目染地把开发反对核心从 Objective-C 转向 Swift,在业界的呼声也越演越烈。当咱们相继迎来 ABI稳固、Module stability、Library evolution 等性能后,咱们期盼已久的 Swift 未然到来,决然启动了京东 App 的混编之旅。咱们仍然保持操之过急,后期对 Swift 技术做了诸多调研工作,具体可见《Swift环境及编译优化调研》。2020年7月京东 App 的首个混编版本上线苹果商店,实现了组件内和主工程的混编工作;近期,咱们实现了对京东组件化管理工具(iBiuTool)的革新,混编组件化性能正式落地,这也标记着京东 Swift 混编根底反对建设结束。然而,Just the beginning... 期待的Swift曾经到来2.1 ABI稳固Swift 5.0,提供 ABI 稳固,解决了 Swift runtime 的版本兼容问题。这意味着通过 Swift 5.0 及以上的编译器编译进去的二进制,就能够运行在任意 Swift 5.0 及以上的 Swift runtime 上。ABI 稳固后,Swift runtime 和规范库曾经植入 macOS 10.14.4、iOS 12.2、watchOS 5.2 及以上零碎中。依据苹果官网数据,截止到 2020年12月15日,四年内公布的 iPhone 设施中 iOS 13及以上占比已达 98%。 另外,ABI 稳固还带来了性能上的晋升。因为 Swift runtime 曾经被深刻的集成在了设施的操作系统中,并且联合零碎层做了许多优化,这就使得 Swift 程序具备更快的启动速度、更好的运行性能,以及更少的内存占用量。 2.2 Module StabilitySwift 5.1,反对 Module Stability,解决模块间编译器版本兼容的问题。这意味着应用不同版本编译器构建的 Swift 模块能够在同一个应用程序中一起应用。即便某些三方库的 Swift 编译器版本与你所应用的不同,也不会存在编译问题。官网文档中举了一个非常失当的例子,应用 Swift 6 构建的 framwork,能够被 Swift 6 和将来的 Swift 7 编译器失常应用。所以这个进化对于开发者来说,相对是一件十分美妙事件。 ...

February 8, 2021 · 4 min · jiezi

关于swift:CollectionView详解

最近将 UICollectionView 进行了一个全面的学习及总结,参考了网上大量的文章,把官网文档进行了大略翻译,最初有个小Demo。 UICollectionView基础知识collection view 是使用一个灵便多变的布局出现一系列有序数据项的一种办法。collection view最通常的应用应用像网格状排列来出现数据项,然而 iOS 的 collection view 的能力不仅限于行和列。应用 collection views, 视觉元素的准确布局可通过子类化定义并被动静扭转。所以你能够实现网格,栈,圆形布局,动静扭转布局,或任何你能够设想的排列布局。Collection View 是由多个对象合作而成 在下面能够看出,一个 CollectionView 视图从 data source 中获取数据信息,data source 和 delegate 来治理具体的单元对象,包含选中、未选中、高亮、未高亮等状态。Layout 决定了每个 cell 之间的边界及布局信息,并通过 layoutattributes 来决定每个 cell 的属性。 ReusableView 采纳的可重用 cell 的办法,能够提高效率,反对三种不同的可重用的viewcell 展现了 collection view 的次要内容,cell 的内容来自你的数据对象,每个 cell 必须是 UICollectionViewCell 类的实例。cell 对象能够治理本人的选中和高亮状态Supplementary views 展现了对于 section 的信息,同样也是数据驱动的,是可选的。Decoration views 装璜视图,不与数据相干,齐全属于 layout 对象。Layout 对象管制视觉显示layout object 决定着 cell 的大小,地位还有其余显示相干的属性。layout object 没有接触任何视图,它只是一个属性汇合。而没有任何限度,你能够随你所想。layout object 不止能够管制视图的宽高尺寸,还能够管制视图之间的关系属性,透明度,3D,和他跟其余视图之间的可见性比照。 ...

December 12, 2020 · 6 min · jiezi

关于swift:Swift-界面路由

随着业务减少,我的项目中的模块越来越多,并且这些模块进行互相的调用,使得它们交缠在一起,减少了保护老本,并且会升高开发效率。此时就须要对整个我的项目进行模块划分,将这些模块划分给多个开发人员(组)进行保护,而后在主工程中对这些模块进行调用。 每个模块独立存在,提供接口供其余模块调用。从而如何无效且解耦的进行模块间的调用成了重中之重。 那么如何传递参数并且初始化对应模块的主窗口成为了次要问题。上面会介绍两种计划来解决这个问题。 计划1得益于Swift中枚举能够传参的个性,咱们能够通过枚举来进行参数传递,而后增加办法来映射控制器。 在枚举中通过参数来确定初始化控制器的数据,内部进行调用时能够很明确的晓得须要传入哪些参数,同时还能传递非常规参数(Data、UIImage等) enum Scene { case targetA case targetB(data: Data) func transToViewController() -> UIViewController { switch self { case .targetA: return ViewControllerA() case let .targetB(data): return ViewControllerB(data: data) } }}解决了UIViewController映射的问题后,咱们接下来解决如何对立跳转办法。 我的项目中,基本上都会应用UINavigationController来进行界面的跳转,次要波及push、pop操作。此时简便的做法是扩大UIViewController为其增加对立界面跳转办法。 extension UIViewController { func push(to scene: Scene, animated: Bool = true) { let scene = scene.transToViewController() DispatchQueue.main.async { [weak self] in self?.navigationController?.pushViewController(scene, animated: animated) } } func pop(toRoot: Bool = false, animated: Bool = true) { DispatchQueue.main.async { [weak self] in if toRoot { self?.navigationController?.popToRootViewController(animated: animated) } else { self?.navigationController?.popViewController(animated: animated) } } }最初咱们跳转界面时进行如下调用即可 ...

November 28, 2020 · 2 min · jiezi

关于swift:SwiftUI-中创建反弹动画

SwiftUI 中的动画在写动画之前呢先简略回顾一下 SwiftUI 中动画的几个要点: 动画是 view 发生变化时的突变成果SwiftUI 动画分为隐式动画(.animation())与显式动画(withAnimation())两种隐式动画是给 view 加动画,view 所有的能动画的变动都能被隐式动画影响显式动画是针对某个变动进行动画,能精准管制。view 的插入和移除通过过渡(transition)来做成果,能够组合多个过渡或自定义过渡要构建自定义动画,咱们须要实现一个可动画的 view 润饰器(恪守 AnimatableModier 协定)或者实现一个 GeometryEffect,并将可动画的属性通过 animatableData 裸露进去反弹动画反弹动画属于“起始点和终止点相等”的动画,所以不可能通过 SwiftUI 中内建的动画来实现(因为这个 view 从后果来看没有发生变化) 咱们先来构建反弹动画润饰器的框架如下: struct Bounce: AnimatableModifier { var animCount: CGFloat = 0 var amplitude: CGFloat = 10 // 振幅 var animatableData: CGFloat { get { animCount } set { animCount = newValue } } func body(content: Content) -> some View { // change view to animate }}上面一步一步来 ...

October 29, 2020 · 2 min · jiezi

关于swift:Swift-中的-Function-Builder-理解与运用

Function Builder 是 Swift 5.1 引入的个性,大大加强了 Swift 语言构建内置 DSL 的能力。SwiftUI 申明式 UI 构建形式就是靠的 DSL 实现的。 从 DSL 说起DSL 是 Domain Specific Language 的缩写,意思就是特定畛域的语言。与之对应的就是咱们相熟的 C, Java, Swift 这些通用的语言,通用语言什么畛域都能够去插一脚,无非就是适不适宜,好不好用罢了。DSL 则是局限在某个特定场景的特地设计过的语言,因为专一,所以业余,它们往往能以十分轻量级的语法和易于了解的形式来解决特定问题。 举几个驰名的 DSL 的例子: 正则表达式通过一些规定好的符号和组合规定,通过正则表达式引擎来实现字符串的匹配 HTML & CSS尽管写的是相似XML 或者 .{} 一样的字符规定,然而最终都会被浏览器内核转变成Dom树,从而渲染到Webview上 SQL诸如 create select insert 这种单词前面跟上参数,这样的语句实现了对数据库的增删改查一系列程序工作 那么这种语言内建的 DSL 有什么益处呢,咱们先来看一个 HTML 的界面搭建: <div> <p>Hello World!</p> <p>My name is KY!</p></div>在 UIKit 里要搭建上述界面很显著要麻烦很多: let container = UIStackView()container.axis = .verticalcontainer.distribution = .equalSpacinglet paragraph1 = UILabel()paragraph1.text = "Hello, World!"let paragraph2 = UILabel()paragraph2.text = "My name is KY!"container.addSubview(paragraph1)container.addSubview(paragraph2)这就是申明式 UI 与 命令式 UI 的区别,申明式 UI 用 DSL 来形容 “UI 应该是什么样子的”,命令式 UI 则须要先创立一个 View,再指定这个 View 的个性,再指定这个 View 要放到哪里,一步一步来,显得较为轻便。 ...

October 26, 2020 · 4 min · jiezi

关于swift:swift53-UIView-与-UIButton-点击事件传递参数

UIView 与 UIbutton 点击事件的参数传递;目前我通过 tag 解决了 UIButton 的点击参数传递设置 UIButton 的 tag,具体见代码 let playButton = UIButton(type: .custom)playButton.setTitle("开始播放", for: .normal)playButton.backgroundColor = UIColor(white: 1.0, alpha: 0.8)playButton.layer.cornerRadius = 17.5// 要害在这一行playButton.tag = index playButton.addTarget(self, action: #selector(playClicked(button:)), for: .touchUpInside)itemView.addSubview(playButton)接管@objc func playClicked(button: UIButton){ print(button.tag)}UIView 的点击事件与传输传递UIView 是没有点击事件这个货色的,不过咱们能够用 UITapGestureRecognizer 手势来解决 具体见代码 let itemView = UIView()itemView.isUserInteractionEnabled = trueitemView.tag = index // 传输传递// 创立手势let tap = UITapGestureRecognizer(target: self, action:#selector(tapClick(sender:)))// 增加到 UIView 上itemView.addGestureRecognizer(tap)homeMusicScrollView.addSubview(itemView)接管同样的情理 @objc func tapClick(sender: UIGestureRecognizer){ let itemView = sender.view! print(itemView.tag)}

October 15, 2020 · 1 min · jiezi

关于swift:swift53-UIColor-使用十六进制颜色

本文环境 Xcode 12Swift 5.3iOS 13UI 给出的色彩往往都是十六进制的,如 #1a1a1a 等,然而咱们在 iOS中是不能间接应用的,查问了一些代码,发现比拟老旧,这里给出一个改良版本 应用 Extension 扩大新建一个 swift 文件比方我的 string.swift ,复制以下代码 //// String.swift// bestWhiteNoise//// Created by 袁超 on 2020/10/10.//import Foundationimport UIKitextension String { /// 十六进制字符串色彩转为UIColor /// - Parameter alpha: 透明度 func uicolor(alpha: CGFloat = 1.0) -> UIColor { // 存储转换后的数值 var red: UInt64 = 0, green: UInt64 = 0, blue: UInt64 = 0 var hex = self // 如果传入的十六进制色彩有前缀,去掉前缀 if hex.hasPrefix("0x") || hex.hasPrefix("0X") { hex = String(hex[hex.index(hex.startIndex, offsetBy: 2)...]) } else if hex.hasPrefix("#") { hex = String(hex[hex.index(hex.startIndex, offsetBy: 1)...]) } // 如果传入的字符数量有余6位依照后边都为0解决,当然你也能够进行其它操作 if hex.count < 6 { for _ in 0..<6-hex.count { hex += "0" } } // 别离进行转换 // 红 Scanner(string: String(hex[..<hex.index(hex.startIndex, offsetBy: 2)])).scanHexInt64(&red) // 绿 Scanner(string: String(hex[hex.index(hex.startIndex, offsetBy: 2)..<hex.index(hex.startIndex, offsetBy: 4)])).scanHexInt64(&green) // 蓝 Scanner(string: String(hex[hex.index(startIndex, offsetBy: 4)...])).scanHexInt64(&blue) return UIColor(red: CGFloat(red)/255.0, green: CGFloat(green)/255.0, blue: CGFloat(blue)/255.0, alpha: alpha) }}应用比方 UI 给的色彩是 #5188e1, 那么咱们间接应用字符的扩大函数即可 ...

October 12, 2020 · 1 min · jiezi

关于swift:从现在开始可以使用Swift语言在Windows-10开发软件

Swift是苹果在2014年WWDC上发表的一种古代语言,它取代了Objective-C成为了苹果平台构建应用程序的次要语言。尔后,苹果对Swift进行了开源,此开源我的项目曾经为Ubuntu、CentOS和Amazon Linux发行版提供了该语言的工具,当然还有macOS,当初又增加了Windows。 Swif团队官网博客: 将Swift移植到Windows并不是简略地移植编译器,而是要确保整个生态系统在该平台上可用。这包含编译器、规范库和外围库(dispatch、Foundation、XCTest)。这些库是使开发者可能轻松编写弱小的应用程序的一部分,而不用放心底层零碎的许多细节。在将Swift带到Windows上可用状态的故事中,有很多技术细节,如果你对这些细节感兴趣,我会举荐你看看我在LLVM开发者大会上对于这个主题的演讲。有了这些外围库以及Swift与C语言的灵便互操作性,就能够在Windows上纯正应用Swift开发应用程序,同时利用Windows平台上现有的库群。 这篇博文持续演示了一个齐全用Swift编写的简略计算器利用。它是用Windows的Swift工具链,以及装置Visual Studio 2019创立的。 长期从事Mac和iOS开发的Readdle公司曾经在Windows上试验了一年多的Swift,作为其将Spark电子邮件客户端带到Windows平台上的致力的一部分。 Readdle示意:只管有些性能还没有筹备好,但Windows上的Swift后果齐全满足了他们的需要。事实上,一些第三方的C/C++依赖性比Swift自身更让他们头疼。Spark的所有业务逻辑都位于一个独立的Core模块中。其实是一包模块,但他们把它们称为Core。这使得他们能够在指标平台上应用任何UI框架。MacOS上的AppKit,iOS上的UIKit,Android上的原生UI Toolkit。所以,基本上,他们必须在Windows上移植Spark Core。在所有初始概念失去证实后,将其在Windows上用起来将是日常工作。 Windows版Swift工具链传送门:https://swift.org/download/

September 23, 2020 · 1 min · jiezi

关于swift:mac-OS-Big-Sur-11-Beta-5发行说明

mac OS Big Sur 11 Beta 5发行阐明更新您的应用程序以应用新性能,并针对API更改测试您的应用程序。 对于SwiftUI局部SwiftUI已知的问题ProgressView通用类型签名已更改,增加了通用参数。此更改不须要任何源更改,但会导致应用较早版本的Beta SDK编译的应用程序意外退出。(63580200)currentValueLabel解决办法:从新编译macOS Big Sur 11 Beta 5或更高版本的应用程序以解决此问题。 macOS Big Sur 11 beta 5中的新性能Color能够与转换CGColor。在当初也能够用绑定到配置。(56939085)ColorPickerCGColor作为将多个我的项目搁置在不可自定义工具栏的特定地位的一种便捷形式而引入。(64178863)ToolbarItemGroupProgressView当初反对增加辅助“以后值标签”来形容工作的以后进度级别。应用label来形容总体工作,并应用提供无关工作进度的更多具体细节。(63580200)currentValueLabelFileDocument 并更新了协定要求: 当初,他们的初始化程序要求只有一个参数,并且能够从中读取。FileDocumentReadConfiguration`fileWrapper`contentType他们write()本来心愿写入inout 参数的函数当初是返回a的函数。FileWrapperfileWrapper()`FileWrapper`Xcode中基于文档的应用程序模板已更新,以反映API中的此更改。与先前要求的源兼容性最终将被删除。(65146043)macOS Big Sur 11 beta 5中已解决的问题蕴含多色符号的图像当初将适应色彩外观。(63726389)Text(_ style:)不再截断。Text当初在小部件内具备灵便的宽度。(60588299)当初已按预期显示Text已利用修饰符的占位符款式的删节。(66346107)lineLimit(1)SwitchToggleStyle并且当初能够在macOS上进行着色。(62906674)LinearProgressViewStyleNavigationLink并在macOS上体现更为统一:不会因为抉择更改而将的抉择谬误地重置为;程序抉择和勾销抉择a 呈现按预期形式。(63791979)NavigationViewNavigationLink`nil`NavigationLink利用一个修改器当初将修复它的大小其内容的大小。(64855179)fixedSize())TextEditor当初已按预期显示Text已利用修饰符的占位符款式的删节。(66242496)minimumScaleFactor总览macOS 11 SDK反对为运行macOS Big Sur 11的Mac开发应用程序。该SDK与Xcode 12 beta 5捆绑在一起,可从Beta软件下载处取得。无关Xcode 12 beta 5兼容性要求的信息,请参阅Xcode 12 Beta 5发行阐明。 个别已知的问题重要 iMac以后不反对macOS Big Sur 11 beta 5(Retina 5K,27英寸,2020年)。如果您在iMac(Retina 5K,27英寸,2020)上遇到装置问题,则须要重新安装macOS Catalina。按住电源按钮强制重新启动,而后在关上Mac之后立刻按Command-R。而后,依照阐明从Recovery重新安装macOS Catalina。 重要 从以前的macOS版本升级到macOS Big Sur 11 beta可能要花费比预期更长的工夫。如果更新中断,则可能会产生数据失落。(59101197) 空投已知的问题如果启用了零碎完整性爱护,则可能无奈应用AirDrop。(67033173)利用商店在macOS Big Sur 11 beta 5中解决[](https://developer.apple.com/d...,在同一文件中导入和SwiftUI 时,能够拜访StoreKit符号。(66337479)StoreKitAppKit请参阅实用于macOS Big Sur 11的AppKit发行阐明。苹果平安赏金macOS Big Sur 11 beta 5被指定为有资格取得50%Apple Security Bounty奖金,以解决Apple未知或在此版本中从新引入的问题。无关更多信息,请参阅Apple平安赏金。端点平安在macOS Big Sur 11 beta 5中解决诸如透露内核内存之类的身份验证类型事件不再导致您的零碎无响应。(65750498)ES_EVENT_TYPE_AUTH_EXECFinal Cut Pro和iMovie已知的问题您目前无奈应用内置摄像头或外部设备捕捉视频。(63528489)应用“导入媒体”窗口时,应用程序可能会意外退出。(65543216)解决办法:将媒体从Finder中拖动以导入它。 ...

August 20, 2020 · 1 min · jiezi

关于swift:Xcode-12-Beta-5发行说明

疾速预览1、终于反对coredata模版创立了 2、已知解决,动画可能无奈在实时SwiftUI预览中应用3、Xcode 12 beta 5开始,在iOS 14上应用InsetGroupedListStyle不再会使在iOS 13上运行的应用程序解体,即便将其包装在版本查看中也是如此。解决方案_was_封装在AnyView中。 总览Xcode 12 beta 5包含实用于iOS 14,iPad OS 14,tvOS 14,watchOS 7和macOS 11的SDK。Xcode 12 beta 5版本反对针对iOS 9和更高版本,tvOS 9和更高版本以及watchOS 2和更高版本的设施上调试。 。Xcode 12 beta 5须要运行macOS Big Sur 11 beta或更高版本的Apple芯片,或者运行macOS Catalina 10.15.4或更高版本的基于Intel的Mac。 苹果Clang编译器弃用i386,x86_64和arm的独立零碎组装程序已弃用,并且可能在当前的Xcode版本中删除。将as命令与-Q标记一起应用会显示正告,批示您过渡到Clang的集成汇编器和-q标记。该as(1)驱动程序将持续,因为调用锵的综合汇编,以及由开发商装置的任何汇编的规范办法。(61299833)建设零碎弃用“构建设置”编辑器不再蕴含“无效体系结构”构建设置(),不倡议应用。而是有一个新的“排除的体系结构”构建设置()。如果我的项目包含,则该设置将显示在“构建设置”编辑器的“用户定义”局部中。(15145028)VALID_ARCHS`EXCLUDED_ARCHS`VALID_ARCHS旧版构建零碎已弃用,并将在当前的版本中删除。(62742902)外围ML弃用不举荐应用Xcode中主动生成的模型接口上的默认初始化程序,而举荐应用init(configuration:)。请改用init(configuration:)或新引入的.load()办法,并适当解决模型加载谬误。(62875309)调试解决从Xcode构建和运行时,Mac上的iPad和iPhone应用程序再次能够拜访按需资源。(62074124)内存图调试器当初能够正确地对以后Xcode工作区中SwiftUI应用程序中定义的类型的起源进行分类。调试导航器会在正确的局部列出这些类型,并在抉择“仅显示工作区中的内容”时将其包含在内。(63899779)解决了苹果芯片上的一个问题,该问题是在模仿设施上调试tvOS利用失败,并显示谬误“无奈附加到pid”。(65375566)已知的问题在运行iOS 14,iPadOS 14,watchOS 7或tvOS 14 beta 4及更高版本的设施上进行调试,测试和性能剖析须要Xcode 12 beta 3或更高版本。尝试在不受反对的操作系统版本上进行开发时,较早版本的Xcode可能会显示谬误“无奈启动近程服务”。(60850305)关上调试仪表时,Xcode可能解体。(64181692)仪器已知的问题插入macOS应用程序时,“动画挂钩”模板不会显示挂钩距离。(61082729)弃用instruments当初不举荐应用该命令,而倡议应用它替换:xctrace。xctrace记录,导入和导出Instruments .trace文件中的数据。(36641078)界面生成器解决UISplitViewController默认状况下,除非已连贯辅助视图控制器,否则Interface Builder中的实例将再次默认应用“未指定”款式。要利用iOS 14的改良,请从查看器的“款式”菜单中选择“双列”。(65966010)(FB8107534)修复了无奈拖动以将情节提要或.xib文件中的对象连接到现有Objective-C插座的问题。(66293812)修复了为蕴含关联视图的iOS文档启用平安区域布局指南时可能产生的解体。(64564818)当初,媒体库在SF Symbols的详细信息区域中显示已弃用的符号信息。(63692751)弃用Interface Builder不再提供对“能够同时绘制”属性的拜访。您仍能够在代码中应用来配置此行为。(42437767)canDrawConcurrentlyQTCaptureView和QTMovieView已被弃用,不再受反对。从情节提要和.xib文件中删除这些视图。(64263402)游乐场已知的问题Xcode可能会在创立后显示文本“ No Editor”,而不是立刻关上Playground的源代码编辑器。(56484197)解决办法:应用“视图”>“导航器”>“我的项目”显示“我的项目导航器”,而后手动抉择“游乐场”。 预告片解决蕴含多个预览的macOS中的Live SwiftUI预览再次是交互式的。(62156572)PreviewProvider对于作为应用程序和小部件链接的框架一部分的文件,SwiftUI预览更为牢靠。(63785700)从macOS 11开始,进步了Mac Catalyst实时预览的可靠性。(63998976)将Mac Catalyst的Live SwiftUI预览调出或显示时不再退出。(64151326)已知的问题Xcode不提供macOS小部件扩大的预览。(57990060)您无奈在“预览”画布的“窗口小部件”中抉择视图。(62517078)动画可能无奈在实时SwiftUI预览中应用。(63333795)进行更改之前,可能无奈显示macOS的Live SwiftUI预览,除非您单击画布上的Bring Forward按钮。(63865018)预览iPad设施的小部件扩展名可能会在顶部显示多余的空白栏。(64277772)利用外观修改器时,窗口小部件扩大预览不适宜深色外观。(64277915).preferredColorScheme(.dark)我的项目浏览器解决调整窗口大小后,“查找”面板仍会响应鼠标事件。(66256586)已知的问题即便MacOS不反对App Clip,App Clip计划也提供“ My Mac(为iPad设计)”或“ My Mac(为iPhone设计)”运行目的地。(65702469)事实作曲家弃用由Xcode 12创立的Reality文件只能在macOS 10.15.4或更高版本,iOS和iPadOS 13.4或更高版本以及Reality Composer 1.4或更高版本中加载。(58825031)签订和散发已知的问题签名为在macOS上本地运行的Mac Catalyst应用程序可能无奈在Mac(Rosetta)运行指标上运行。(64421496)利用剪辑无奈再通过“通行证类型ID”权力拜访电子钱包通行证。然而,App Clips能够确定电子钱包中是否曾经存在特定的通行证,并在必要时提醒用户增加通行证。如果您曾经将电子钱包性能增加到App Clip指标,则可能无奈构建或将利用提交到App Store Connect。在指标编辑器的“签名和性能”窗格中删除“电子钱包”性能,并禁用或删除任何应用此已删除性能的代码。(65244156)应用Ad Hoc或Development办法散发iOS存档时,Xcode不会验证主动签名生成的配置文件中是否蕴含具备Apple芯片的Mac。(66803918)仿真器已知的问题当在具备content-available键集的Simulator中模仿推送告诉时,零碎将调用而不是。(60426170,60974170)(FB7625283)application(_:performFetchWithCompletionHandler:)application(_:didReceiveRemoteNotification:fetchCompletionHandler:)即便Xcode Preferences容许您下载这些较早的运行时,iOS 13,tvOS 13和watchOS 6或更早版本的模拟器也不能在Developer Transition Kit上运行。带有苹果芯片的将来Mac将反对某些较旧的iOS和tvOS模拟器。(66115743)弃用在macOS 11中运行时,Simulator反对iOS 11.4或更高版本。(59938106)watchOS 6或更早版本的模拟器须要32位过程,而带有Apple芯片的Mac则不反对。(66352760)源代码编辑器解决修复了在启用某些扩展名或启用这些扩展名时可能在启动时产生的挂起。(61952790)已知的问题新的Xcode Source Editor Extension指标不会主动在扩大中设置嵌入。(59274389)XcodeKit.framework解决办法:手动嵌入扩大中。XcodeKit.framework ...

August 19, 2020 · 1 min · jiezi

关于swift:Swift枚举关联值的内存探究

enum Season { case Spring, Summer, Autumn, Winter}let s = Season.Spring这是枚举最根底的用法,然而在swift中,对枚举的性能进行了增强,也就是关联值。 关联值能够将额定信息附加到 enum case中,像上面这样子。 enum Test { case test1(v1: Int, v2: Int, v3: Int) case test2(v1: Int, v2: Int) case test3(v1: Int) case test4}let t = Test.test1(v1: 1, v2: 2, v3: 3) switch t {case .test1(let v1, let v2, let v3): print(v1, v2, v3)default: break}// 输入: 1 2 3咱们能够看到,在咱们创立一个枚举值t的时候,设置他的选项为test1,同时能够关联3个Int类型的值,而后在switch中,咱们还能够把这3个Int值取出来进行应用。 咱们明天的次要工作就是摸索一下有关联值的枚举类型,再底层的内存布局是什么样子的,这些值都是怎么贮存的。 在OC中咱们应用sizeOf此类办法,能够输入一个变量占用内存的大小,在swift中也有此类的工作类,那就是MemoryLayout。 print(MemoryLayout<Int>.size)// 理论应用内存大小print(MemoryLayout<Int>.stride)//分配内存大小print(MemoryLayout<Int>.alignment)//内存对其参数// 输入 8 8 8 下面的例子是只是简略的实例MemoryLayout的用法,这个咱们晓得,在64位的零碎中Int类型的确是占用8个字节(64位)。接下来咱们就看一下枚举的内存占用状况。 ...

August 18, 2020 · 2 min · jiezi