Swift

Swift 是一种支持多编程范式和编译式的编程语言,是用来撰写 macOS / OS X、iOS、watchOS 和 tvOS 的语言之一。

  • Total
  • 1178
话题聚合
  • 布隆过滤器与 Swift 4.2

    就这点而言,使用布隆过滤器只需要修改该索引处的值:将 false 改为 true,而不用像使用集合或字典那样,把对象存放到索引位置...一些布隆过滤器确实会使用不同的方法计算哈希值,但我觉得使用相同的算法,同时混入一个随机生成的值会更简单...比特数组会简单的重复 false 值来初始化,而种子值则使用 Swift 4.2 的新 API Int.random 来生成我们需要的种子值。
  • Swift 属性观察器

    Swift 属性观察器

    struct S { // 存储属性 var stored: String = "stored" // 计算属性 var computed: String { return "computed" }}当你声明一个存储属性,你可以使用闭包定义一个 属性观察器,该闭包中的代码会在属性被设值的时候执行...对于存储属性,willSet 和 didSet 观察器将替换你在 ivar 访问时的代码...我们之所以不使用 willSet 观察器是因为即使我们在其回调中进行任何赋值,都会在属性被赋予 newValue 时覆盖。
    16 小时前
  • Swift中的命名空间

    Swift中的命名空间

    我们需要用源代码的形式打开Info.plist,可以看到里面有一个字段CFBundleExecutable,它对应的值就是命名空间...)四、命名空间在开发中的使用开发中有一种常见的情形,就是自定义TabBarController,然后在里面添加一个个子控制器,这里面常常存在一个问题:通过一个控制器名(字符串)来创建一个控制器(类)...}Swift中命名空间的存在,如果按照上述做法得不到想要的结果,这时候就需要想办法进行处理//viewDidLoad中添加一个个控制器。
  • iOS可视化动态绘制连通图(Swift版)

    iOS可视化动态绘制连通图(Swift版)

    一、图的绘制在本篇博客的第一部分我们要按照要求先把图给绘制出来,我们会随机的生成几个坐标点,然后在这些坐标点上添加上View,然后再将这些坐标点使用Bezier进行连接...下方这段就是节点View的TouchesMoved事件,在该事件中我们获取到当前用户触摸移动的坐标点,然后将该点赋值给当前节点View的Center,然后调用更新父视图的闭包回调对象即可...效果如下所示:本部分主要修改的内容是节点View的父视图,核心就是要计算当前点与周围点的距离,如果该距离小于我们规定的距离的话,那么我们就画线,否则就不画线。
  • iOS开发之资讯类App常用分类控件的封装与实现(CollectionView+Swift3.0+)

    iOS开发之资讯类App常用分类控件的封装与实现(CollectionView+Swift3.0+)

    本篇博客所涉及的技术点主要有UICollectionView的Cell移动,手势识别,控件封装,闭包回调,面向接口编程,Swift中的泛型等等...下方效果的实现使用了iOS9以后的UICollectionView才支持的更新Cell的方法,稍后会详细介绍到...5、longPressEnd()方法实现该方法的主要功能是在手势结束后做一些善后工作,如结束移动,然后移除掉Cell的快照并显示隐藏掉的cell。
  • [译]Swift 中的类型擦除

    [译]Swift 中的类型擦除

    where Seq.Element == Element {        return MAnySequenceImpl(seq)    }}我们来用一下这个 MAnySequence:func printInts(_ seq: MAnySequence) {    for elt in seq {        print(elt)    }}let array = [1, 2, 3, 4, 5]printInts(MAnySequence.make(array))printInts(MAnySequence.make(array[1 ..4]))基于函数的擦除**我们希望公开多个类型的功能而不公开这些类型...他接受任意的 Sequence 作为参数(Sequence、Sequence):init(_ seq: Seq) where Seq.Element == Element {然后需要把这个 Sequence 需要的功能包装在这个函数中:        _makeIterator = {再然后我们需要在这里做一个迭代器 Sequence 正好有这个东西:var iterator = seq.makeIterator()最后我们把这个迭代器包装给 MAnySequence...这种基于函数的擦除方法在处理需要把一小部分功能作为更大类型的一部分来包装的时候非常有效, 这样做就不需要有单独的类来擦除其他类的类型信息。
  • # Swift学习 # 简单面试题

    # Swift学习 # 简单面试题

    isDisjointWith(_:) //判断两个集合是否不含有相同的值11.实现一个 min 函数,返回两个元素较小的元素func minNum(a: T, b: T) ->...不会,值类型36.给集合中元素是字符串的类型增加一个扩展方法,应该怎么声明extension Array where Element == String { }37.定义静态方法时关键字 static 和 class 有什么区别非class类型 一般 统一用 static  例如  枚举 结构体...默认静态派发,如果需要满足动态派发,需要 dymanic修饰47.Swift有哪些修饰符open、public 、internal、fileprivate、private48、实现一个函数,输入是任一整数,输出要返回输入的整数 + 2func plusTwo(one: Int) ->。
  • iOS开发之常用资讯类App的分类展示与编辑的完整案例实现(Swift版)

    iOS开发之常用资讯类App的分类展示与编辑的完整案例实现(Swift版)

    主菜单页面上方就是我们的菜单选项了,点击相应的菜单项,会显示相应的内容...三、CEScrollMenu组件的介绍该组件就是本示例上面横向滚动的菜单项,该组件的右边有一个“+”号按钮,点击该按钮将会通过闭包的形式将按钮的点击事件回调给CEMenuScrollController控制器,由该控制器Present出CESelectTheme组件进行数据源的操作...具体做法如下所示:关于CEScrollMenu组件的介绍,本篇博客就先介绍这么多,更详细的代码请移步于文章后方的github地址。
    2018-12-07
  • 让我们构建一个Swift.Array

    让我们构建一个Swift.Array

    比如,在实现 append 方法的时候你可以先对 ArrayImpl 进行 copy (假设 ArrayImpl 的实现中有一个 copy 方法,那么将 impl 引用改为原始值的 copy):...随着数据的移动完成,旧指针将可以被释放,新的数据将被赋值给类的属性: */ ptr.dealloc(space) ptr = newPtr space = newSpace } // 现在我们确信有足够的空间,所以可以把新的值放在内存的最后面并且递增 count 属性的值: (ptr + count).initialize(obj) count++ }改变过的 remove 方法将更为简洁,因为没有必要重新分配内存...func remove(# index: Int) { (ptr + index).destroy() // moveInitializeFrom 方法负责将所有在被移除元素之后的元素往前挪一个位置 (ptr + index).moveInitializeFrom(ptr + index + 1, count: count - index - 1) // 递减 count 属性的值来体现这次删除操作 count--}我们同样需要一个 copy 方法来确保当需要的时候可以从数据内存中复制一份。
    2018-12-06
  • Swift 中的面向协议编程:是否优于面向对象编程?

    在 Swift 中使用 POP 还有一个好处:不仅仅是类,值类型也可以遵循协议,比如 struct 和 enum...因为 Swift 中的 struct 是一种值类型,并且能够遵循协议,苹果也在大力推进 POP 以取代 OOP,在 面向协议和值编程 你可以找到这背后的原因...BobBob 1Bob 1 3.01 3.03.0EMPTYBob1 Bob3.0 1 Bob1 BobBobEMPTY我没有 100% 使用 POP在 WWDC 有关 POP 的视频之一中,一位工程师/讲师说 ”在 Swift 中我们有一种说法,不要从一个类开始写代码,从一个协议开始“。
  • Android 版 SwiftKey 键盘加入搜寻功能

    Android 版 SwiftKey 键盘加入搜寻功能

    有试过与朋友在传讯息途中谈到一个新话题需要找网路大神的答案吗...如果你有使用 SwiftKey 的话就可以省下这工夫了,因为它的键盘工具列中新增了搜寻工具,只要点击几下就可以到 Bing 搜寻网页结果,而且可以即时预览内容,过程不需要离开讯息 app...有合用的资料更可以撷图或分享 URL 给对方,一键完成工作。
    2018-11-29
  • Swift 中的设计模式 #3 外观模式与适配器模式

    Swift 中的设计模式 #3 外观模式与适配器模式

    URL { switch directory { case .Documents: return documentsDirectoryURL() case .Inbox: return inboxDirectoryURL() case .Library: return libraryDirectoryURL() case .Temp: return tempDirectoryURL() } } func buildFullPath(forFileName name: String, inDirectory directory: AppDirectories) ->...= containing.data(using: .utf8) return FileManager.default.createFile(atPath: filePath, contents: rawData, attributes: nil) } func readFile(at path: AppDirectories, withName name: String) ->...FileManager.default.moveItem(at: originURL, to: destinationURL) return true } func copyFile(withName name: String, inDirectory: AppDirectories, toDirectory directory: AppDirectories) ->。
    2018-11-29
  • 理解 Swift 中的元类型:.Type 与 .self

    理解 Swift 中的元类型:.Type 与 .self

    比如 Int.Type 就是 Int 的元类型...types.append(Int.self)如果分清了 Int.Type 是类型的名称,不是值就不会再弄错了...let metatype: MyProtocol.Type = MyType.self那么 Protocol.self 是什么类型呢。
    2018-11-27
  • 用 Swift 解读 React/React Native: Part 1

    用 Swift 解读 React/React Native: Part 1

    React 里一个很重要的概念是:所谓 UI(无论是一个 App,一个页面,还是一个组件)都可以理解成是一种数据结构(描述原始数据)到另一种数据结构(描述 UI)的转化(Transformation)怎么理解呢,比如我们有一种描述“用户”的数据结构:struct User {      let name: String    let job: String}我们有一个“用户”的实例:let allen = User(name: "Allen", job: "iOS Engineer")  我们直接定义这么一个“名片组件”并用它生成一个实例:func NameCard(user: User) ->...在讨论 React Element 的实现之前,我们先回头看一下上面的组件在实际应用中会有哪些缺点/弱点:UI 的构建是线性且同步的,意味着这个构建过程无法打断,也无法通过多线程/多任务提升效率真正构建子组件的过程是内联(inline)的,不能很方便的在系统层面进行监督(supervise)和缓存结果内存开销,这一点其实也是 1 带来的,每次实例化一个容器组件,所有的子组件都同时被实例化React 中引入 Element 的作用就是解决以上问题,所以 Element 应该有以下特性:把 Component 的状态描述与构建分离高度抽象 Component 的状态,便于在系统层面做 diff 和缓存轻量,降低渲染前的内存开销简单来说,以上一节里的例子来说,(component: NameCardList, users: users) 这两个数据,已经足够描述整个 App 的状态了,即便子树中的 NameCard 还没有被渲染...Node {      let component = root.createComponent()    var children: Array= []    if let childElement = component.render() {        children = [render(childElement)]    }    return Node(component: component, children: children)}print(render(root))  我们用这个方法渲染上一节得到的 Root Element,得到:Node(    component: NameCardList(    props: NameCardListProps(      children: nil,      users: [        __lldb_expr_6.User(name: "Allen", job: "iOS Engineer"),        __lldb_expr_6.User(name: "Nella", job: "Reenigne SOi")      ]    )  ),  children: Optional([__lldb_expr_6.Node(    component: View(      props: ViewProps(        children: Optional([          __lldb_expr_6.Element(            componentClass: __lldb_expr_6.NameCard,            props: __lldb_expr_6.NameCardProps(              children: nil,              user: __lldb_expr_6.User(name: "Allen", job: "iOS Engineer")            )          ),          __lldb_expr_6.Element(            componentClass: __lldb_expr_6.NameCard,            props: __lldb_expr_6.NameCardProps(              children: nil,              user: __lldb_expr_6.User(name: "Nella", job: "Reenigne SOi")            )          )        ])      )    ),    children: Optional([])  )]))注意,我们新定义的 Node 是用来 hold Component 的实例的,所以可以理解为 Node Tree 就是 Component 的实例树。
    2018-11-26
  • Swift 中的设计模式 #2 观察者模式与备忘录模式

    Swift 中的设计模式 #2 观察者模式与备忘录模式

    更具体一点地在 iOS 应用层级上说,当某一个实例(也就是被观察者)的状态发生改变时,它会通知其他(不止一个)的被称为观察者的实例,告诉他们自己的某个状态发生了变化...Void} // 在任意遵循 ObservedProtocol 示例的某些状态发生改变时,会通知*所有*已订阅的观察者...@IBAction func restoreUserTapped(_ sender: Any) { let user = User(stateName: "userKey") firstNameTextField.text = user.firstName lastNameTextField.text = user.lastName ageTextField.text = user.age user.show() } } // ViewController 类结束结论即便 GoF 的设计模式已经在多数开发者心中被视为圣经般的存在(我在文章开头提到的),但仍有某些对设计模式持有批评意见的人认为,设计模式的使用恰恰是我们对编程语言不够了解或使用不够巧妙的证明,而且在代码中频繁使用设计模式并不是一件好事。
    2018-11-26
  • Swift封装 - 计算器开发

    Swift封装 - 计算器开发

    .snp.height).multipliedBy(0.2)        })        //设置tag值        btn.tag = index + 100        //添加点击事件        btn.addTarget(self, action: #selector(btnClick(_:)), for: .touchUpInside)        //设置标题        btn.setTitle(dataArray[index], for: .normal)        //对上一个按钮更新保存        frontBtn = btn    }}上面就构建了一个简单的键盘界面,约束代码大家可以看一下,排版为5行4列,布局顺序为从下向上、从左向右依次布局创建上述代码的点击方法@objc func btnClick(_ button:DWFuncButton) {        print(button.currentTitle as Any)    }用户在操作面板上进行输入操作,在计算器的显示屏上还需要显示输入的内容,同时,显示屏还兼有计算结果的功能...//用户输入表达式或者计算结果字符串    var inputString = ""    //历史表达式字符串    var historyString = ""    //所有数字字符 用于进行检测匹配    let figureArray:Array = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "."]    //所有运算功能字符 用于进行检测匹配    let funcArray = ["+", "-", "*", "/", "^"]    init() {        super.init(frame: CGRect.zero)        inputLabel = UILabel()        historyLabel = UILabel()        setupUI()    }    func setupUI() {        //设置文字的对其方式为右对齐        inputLabel...)    }}ViewController类也需要将DWBoard类实例和DWScreen类实例作为自己的属性,相互调用let board = DWBoard()let screen = DWScreen()在viewDidLoad()方法添加setupUI(),并且setupUI代码如下func setupUI() {    self.view.addSubview(board)    //设置代理    board.delegate = self    board.snp.makeConstraints { (make) in        make.left.equalTo(0)        make.right.equalTo(0)        make.bottom.equalTo(0)        make.height.equalTo(board.superview。
    2018-11-23
  • 超2亿美元签下Taylor Swift,环球音乐这份天价合约透露了哪些信号?

    超2亿美元签下Taylor Swift,环球音乐这份天价合约透露了哪些信号?

    近日,环球音乐集团官网宣布已与Taylor Swift(泰勒·斯威夫特)签下全球独家唱片合约,其在美国市场所属厂牌为环球音乐旗下的Republic Records(共和唱片)...该合约受到全球音乐行业极大的关注,但受关注的原因并不仅仅在于“钞票挖掘机”Taylor Swift的新东家正式落定,更在于以下两点:Taylor此后将拥有所有自己原创歌曲的版权,并为所有环球旗下艺人争取到了环球出售Spotify股份的分成...《华尔街日报》称,Taylor Swift的新协议还附带了一项约定:环球音乐若出售Spotify Technology SA (SPOT)持股,需要把所得款项分配给公司旗下艺人,不能少于此前卖出Spotify股票的两家大型唱片公司的同类分红额。
    2018-11-23
  • 环球音乐为了签Taylor Swift,拿出了史上最值钱合约

    环球音乐为了签Taylor Swift,拿出了史上最值钱合约

    11月19日,Taylor Swift在ins上发文宣布自己将离开Big Machine Label Group (BMLG),转而投向环球音乐集团旗下厂牌Republic...Taylor将在此后拥有所有出自自己手中的作品的“master recordings”,并为所有环球旗下艺人争取到了环球出售Spotify股份的分成...也就是说,除了合同内相关收益,环球为了签Taylor Swift,连音乐版权都不要了,堪称史上最值钱合约。
    2018-11-21
  • Swift 中的weak,unowned,Closure Capture List

    Swift 中的weak,unowned,Closure Capture List

    在方括号(capture list)中,可以利用weak、unowned关键字把默认的strong reference 改为非strong reference,从而解决closures和类实例(class instance)之间的Reference Cycle...小结weak和unowned个人总结两者的异同:相同点weak和unowned都可以解决Reference Cycle,所以他们相同的地方:都不会对object进行reference count(引用计数)加1的操作都可以解决reference cycle这个问题(这句好像有点废)不同点weak修饰的属性,只能是变量(var),同时只能是Optional类型,因为在模拟实际情境中,这个属性有可能是没有具体值的...官方文档给出的答案是:Unlike a weak reference, however, an unowned reference is used when the other instance has the same lifetime or a longer lifetime.对于什么时候用unowned,When to use strong, weak and unowned reference types in Swift and why一文给出类似的答案:The rule here is to use it if we can guarantee that the lifecycle of the referenced object is equal or greater than the lifetime of the variable pointing to it. In that case we know for sure that the object will not be deallocated and we can safely use it. 上面用对象的「lifetime/生命周期」来解释,相对抽象,感觉也不好判断,在具体实践中或许可以这样判断:当两个属性在实际情况中都允许是nil的时候(「Person」中的「apartment」,「Apartment」中的「tenant」,初始化后,都可以为nil):用weak。
    2018-11-19
  • 交换方法Method Swizzling[swift]

    交换方法Method Swizzling[swift]

    1. dispatch_once替代方案OC中用来保证代码块只执行一次的dispatch_once在swfit中已经被废弃了,取而代之的是使用static let,let本身就带有线程安全性质的.例如单例的实现.final public class MySingleton {...static func swizzlingForClass(_ forClass: AnyClass, originalSelector: Selector, swizzledSelector: Selector)...static func swizzlingForClass(_ forClass: AnyClass, originalSelector: Selector, swizzledSelector: Selector) {。
    2018-11-16

相关链接

为你发现的专属好站