Swift 里 Dictionary】的更多相关文章

Dictionary uses two storage schemes: native storage and Cocoa storage. 只看 native storage 的,也就是和 OC 无关的. 类图  内存分布  分配内存的地方: static internal func allocate( scale: Int8, age: Int32?, seed: Int? ) -> _DictionaryStorage { // The entry count must be repr…
字典 key它必须是可哈希的,也就是说,它必须能够提供一个方式让自己被唯一表示出来.Swift的所有基础类型(例如String.Int.Double和Bool)默认都是可哈希的,这些类型都能够用作字典中的键.枚举成员中没有绑定值的值(参见枚举)默认也是可哈希的. 而值可以是NSobjcet的类型 不可变字典 let let dictA = [] print(dictA["key3"]) 可变字典 var 字典的键值对的类型 是根据初始化时候的类型来决定的,类型是后面无法改变的 ①第一种…
最近在回答StackOverflow的问题时,发现performSelector方法在Swift被去掉,Apple的注释是这个方法被去掉是因为不安全: NOTE The performSelector: method and related selector-invoking methods are not imported in Swift because they are inherently unsafe. 如果在Swift调用这个方法会编译出错: 'performSelector' is…
在OC里使用惯了AFNetworking,比较喜欢这一个第三方库,在别的途径里得知可以在Swift里使用AFNetworking.但是那个时候我不知道具体的操作是怎样的,于是我只能去百度.GOOGLE了,还好让我给找到了答案,因而在这里和大家分享一下. 1.首先把下载好的AFN库直接拖到工程中 2.这里把Copy item if needed这个选项勾上,然后点完成 3.这时会有一个弹出框,点击YES 4.这个是拖拽好的截图,你会发现多了一个Header文件,也就是图中高亮的那个文件了.因为我的…
Swift里对于字符串这些引入了index型,相对其他语言而言字符操作更安全了,但是问题就是一不注意搞错范围就会有各种离奇的bug. 在讲主题前,先说个小细节. Swift里非常严密的定义了一大堆字符串长度量,但我们实际开发基本上只有字符(character)的长度有用. 还是上例子 var strTemp = "这只是一个萌萌哒小测试" print("萌萌哒长度: " + String(strTemp.characters.count)) 运行结果如下: 萌萌哒长…
中缀语法是OC里特有的一种,就是在函数的参数前面加一个解释词,让调用的时候明白该参数的含义 比如: -(void)processDataWithparamaA:(NSString *)paramaA paramaB:(NSString *)paramaB{ } 调用的时候: [self processDataWithparamaA:@"A" paramaB:@"B"]; 不过你发现没,这中缀语法的前提是你必须在函数名的最前面,写个With啥的说明第一个参数的名字,否…
下午在适配iPadUI的时候,用到了UIPopoverPresentationController,然后在转屏的时候需要调用UIPopoverPresentationControllerDelegate来返回一个适配后的view和CGRect,这里先看下在OC里的写法: - (void)popoverPresentationController: (nonnull UIPopoverPresentationController *) popoverPresentationController w…
init() 函数 在 Array 里 public init() { _buffer = _Buffer() } 以Buffer 是 _ContiguousArrayBuffer 为例. 即初始化了一个_ContiguousArrayBuffer. 在_ContiguousArrayBuffer里 /// Create an empty buffer. @inlinable internal init() { _storage = _emptyArrayStorage } 其中 _emptyA…
以append操作为例 public mutating func append(_ other: String) { if self.isEmpty && !_guts.hasNativeStorage { self = other return } self._guts.append(other._guts) } _StringGuts 做了实际的工作 下面是实际进行append的地方 internal mutating func append(_ slicedOther: _Strin…
import UIKit /* 字典的介绍 1.字典允许按照某个键访问元素 2.字典是由两部分组成, 一个键(key)集合, 一个是值(value)集合 3.键集合是不能有重复的元素, 值集合可以有重复的元素, 键和值是成对出现的 4.Swift 字典类型是Dictionary 也是一个泛型集合 5.字典分为  可变字典和 不可变字典 let 修饰不可变字典   var修饰可变字典 */ //1.定义字典 //1>定义不可变字典 //OC   @{@"name":@"s…
Adding Elements internal func _unsafeInsertNew(_ element: __owned Element) { _internalInvariant(count + 1 <= capacity) let hashValue = self.hashValue(for: element) if _isDebugAssertConfiguration() { // In debug builds, perform a full lookup and trap…
isEmpty /// A Boolean value that indicates whether the set is empty. @inlinable public var isEmpty: Bool { return count == 0 } count /// The number of elements in the set. /// /// - Complexity: O(1). @inlinable public var count: Int { return _variant…
类图  Set 是一个结构体,持有另一个结构体_Variant. 最终所有的元素存储在一个叫做__RawSetStorage的类里. 内存布局  结构体分配在栈上,和__RawSetStorage相关的变量分配在堆里. __RawSetStorage 只有一些基本的属性,比如count.capacity等. 在初始化__RawSetStorage时,会在类的尾部继续分配内存,真正的存储Set里的对象. static internal func allocate( scale: Int8, a…
_UnsafeBitset  是一个固定大小的 bitmap,用来确定指定位置是否有元素存在. HashTable  具体的 hash 碰撞算法在HashTable里实现,目前使用的是简单的开放地址法,使用算法是Linear probing. HashTable 的属性 其实只有若干个 UInt,每一位用来表示状态,指定位置有没有被占用. @usableFromInline internal var words: UnsafeMutablePointer<Word> 算法相关 maxLoa…
根据下标取值 关键代码如下: func _getElement( _ index: Int, wasNativeTypeChecked: Bool, matchingSubscriptCheck: _DependenceToken ) -> Element { #if _runtime(_ObjC) return _buffer.getElement(index, wasNativeTypeChecked: wasNativeTypeChecked) #else return _buffer.g…
判断是否为空 使用的是Collection协议里isEmpty的判断. public var isEmpty: Bool { return startIndex == endIndex } startIndex 总是返回 0. public var startIndex: Int { return 0 } endIndex代码如下: @inlinable public var endIndex: Int { @inlinable get { return _getCount() } } 最终用到…
public struct Array<Element>: _DestructorSafeContainer { #if _runtime(_ObjC) @usableFromInline internal typealias _Buffer = _ArrayBuffer<Element> #else @usableFromInline internal typealias _Buffer = _ContiguousArrayBuffer<Element> #endif…
http://blog.sina.com.cn/s/blog_57f61b490101a8ca.html 最近有人讨论到swift副本数是否能够调整,3副本成本过高,如果改成2副本怎么样?多聊了几句以后发现不少人可能都是望文生义,简单的认为副本数只是多一个少一个Copy的问题,并不了解背后的理论依据.所以想写个简单的介绍,普及分布式系统设计的一些基础知识点.这个是按傻瓜版写的,已经知道的同学请自动无视. 不同于传统的集中式存储,对于分布式存储系统来说,因为自身的复杂性,副本数并非简单拍脑门而来,…
在 String 里,用来索引 Character 的,不是整数,而是StringIndex 内部结构 extension String { /// A position of a character or code unit in a string. @_fixed_layout public struct Index { @usableFromInline internal var _rawBits: UInt64 @inlinable @inline(__always) init(_ ra…
Native strings have tail-allocated storage, which begins at an offset of nativeBias from the storage object's address. String literals, which reside in the constant section, are encoded as their start address minus nativeBias, unifying code paths for…
 small string, 只有两个 UInt64 的字,这里面存储了所有的信息. 内存布局如下:  第二个 UInt64 存储了标记位和长度信息,以及部分字符串的值 // Get an integer equivalent to the _StringObject.discriminatedObjectRawBits // computed property. @inlinable @inline(__always) internal var rawDiscriminatedObject…
对于普通的字符串,对应的_StringObject 有两个存储属性: _countAndFlagsBits: UInt64 _object: Builtin.BridgeObject _countAndFlagsBits 存储者字符串的长度和一些标记位. ┌─────────┬───────┬──────────────────┬─────────────────┬────────┬───────┐ │ b63 │ b62 │ b61 │ b60 │ b59:48 │ b47:0 │ ├────…
感受一下字符串相关的源文件个数  String 概览 是一个结构体 只有一个变量,类型是 _StringGuts  如上所示,String 真正的内容在__StringStorage或者__SharedStringStorage里面. private static func create( realCodeUnitCapacity: Int, countAndFlags: CountAndFlags ) -> __StringStorage { let storage = Builtin.a…
 基础知识 指针的内存状态 typed? initiated? ❌ ❌ ✅ ❌ ✅ ✅ 之前分配的内存可能被释放,使得指针指向了未被分配的内存. 有两种方式可以使得指针指向的内存处于Uninitialized状态: 刚刚被分配内存 内存被deinitialized var bytes: [UInt8] = [39, 77, 111, 111, 102, 33, 39, 0] let uint8Pointer = UnsafeMutablePointer<UInt8>.allocate(cap…
即contains操作 /// - Parameter member: An element to look for in the set. /// - Returns: `true` if `member` exists in the set; otherwise, `false`. /// /// - Complexity: O(1) @inlinable public func contains(_ member: Element) -> Bool { return _variant.co…
 to OC func _bridgeToObjectiveCImpl() -> AnyObject { if _guts.isSmall { return _guts.asSmall.withUTF8 { bufPtr in // TODO(String bridging): worth isASCII check for different encoding? return _swift_stdlib_CFStringCreateWithBytes( nil, bufPtr.baseAdd…
即以 UTF16 编码的格式来查看字符串. UTF16View 是一个结构体 @_fixed_layout public struct UTF16View { @usableFromInline internal var _guts: _StringGuts @inlinable internal init(_ guts: _StringGuts) { self._guts = guts _invariantCheck() } } UTF16View 遵守 BidirectionalCollec…
即以 Unicode Scarlar 的方式来查看字符串. /// let flag = "…
Shared strings do not have tail-allocated storage, but can provide access upon query to contiguous UTF-8 code units. Lazily-bridged NSStrings capable of providing access to contiguous ASCII/UTF-8 set the ObjC bit. Accessing shared string's pointer sh…
 最终都要走到__StringStorage 的 create(realCodeUnitCapacity,countAndFlags) 方法里去. 默认实现是 UTF8 internal static func _fromCodeUnits< Input: Collection, Encoding: Unicode.Encoding >( _ input: Input, encoding: Encoding.Type, repair: Bool ) -> (String, repair…