1.NS_ASSUME_NONNULL_BEGIN && NS_ASSUME_NONNULL_END 在Swift中存在Option类型,也就是使用?和!声明的变量。...,也增加了两个相应的特性,因此上例中的items属性可以如下声明: @property (nonatomic, copy, nonnull) NSArray * items; 当然也可以用以下这种方式:...复杂的指针类型(如id *)必须显示去指定是nonnull还是nullable。...老代码在需要和swift混编时,在新的swift编译器下会给出一个警告。 nonnull不会影响性能。事实上,我们仍然可以在运行时去判断我们的对象是否为nil。...NS_ENUM_AVAILABLE_IOS 从单词的字面可以看出使用这个宏说明这个枚举开始IOS的版本 IOS版本如下 7_0 代表7.0的版本.用_替换 参数只有一个NS_ENUM_AVAILABLE_IOS
变量用var标识,常量用let标识 Swift对于空格敏感 Swift输出变量写法为\(变量/常量名) 在Swift中,整形自己主动判断为Int,假设系统是32位系统,那么这个整形就是Int32,...假设是64位系统,那么就是Int64 假设须要特定的整形数,则须要手动写上类型指定(如:Int8) 在Swift中浮点型默觉得double,假设想要float类型须要显示指定 在Swift中不支持隐式转换...,假设想让两个不同类型的数据进行运算,那么须要显示的转换类型:类型名(常量/变量名) 变量名能够是汉字,符号等(仅仅要是Unicode字符都能够) 在Swift中变量/常量名差点儿支持全部的Unicode...如:names.count 不可变数组(用let修饰的)不能增删元素,但能够替换元素 tip:数组在定义时元素类型不一致,系统会默认该数组为NSArray 字典: 与OC不同,字典也用[]..._”替换为变量/常量,就可以取出元组中相应位置的元素 假设同一时候满足多个case,除非case中含有fallthrough语句,否则仅仅运行第一条语句 循环语句: 语法: for 初值; 条件
本文旨在帮助不熟悉这项技术的人,开始在实际开发过程中,尝试使用它。 ---- 这是个啥 swizz 这个词在英语里面是“欺骗”的意思。...那就写个新方法,给原方法加个可以输出 index 的功能,再用 swizz 替换一下两个方法的实现吧。 这里我贴了完整的一个 demo 的代码,你可以直接粘到 Xcode 里面运行。...(arr.containsObject("Swift")) // true NSArray.swizz() // 方法互换 print...("Swift")) // true } } extension NSArray { // 用来和默认方法进行替换的方法 func myContainsObject...> 这个方法的内部实现替换掉了。
在2015年的WWDC上苹果推出了Swift 2.0版本,为了让开发者能从Objective-C更好的过度到Swift上,苹果也为Objective-C带来了Generics泛型的支持。...通常情况下父类型出现的地方都可以用子类型的替换。...(如:参数的类型) @interface Teacher : NSObject @end @implementation Teacher @end ....person可以转成student 4.2、系统类举例 我们经常在OC中看到的泛型 例如NSArray: NSArray *array = @[]; 看一下NSArray对泛型的定义.../OC 中的应用.
(Class Clusters),一个NSArray的实现可能由多个类组成。...所以如果想对NSArray进行Swizzling,必须获取到其“真身”进行Swizzling,直接对NSArray进行操作是无效的。...) 注:对于 Swift 的自定义类,因为默认并没有使用 Objective-C 运行时,因此也没有动态派发的方法列表,所以如果要 Swizzle 的是 Swift 类型的方法的话,是需要将原方法和替换方法都加上...再注:下面这个例子使用了 Objective-C 的动态派发,对于 NSObject 的子类(UIViewController)是可以直接使用的,并不是 Swift 中自定义的类,因此没有加 dynamic...Method Swizzling 中 Objective-C 与 Swift 的异同 区别 Objective-C Swift Runtime 头文件 #import
一、运算符 1.运算符与变量之间的间隔 :一元运算符与变量之间没有空格: !...pragma mark - 自定义 //是否匠币 @property (nonatomic, assign) BOOL gjr_isCoinPay; @end 2.示例注释 如对外api提供调用接口,如比较复杂...boldSystemFontOfSize:fontSize] #define GJR_SCREEN_WIDTH 375.00 extern const NSString GJR_USER_AGE_KEY = @"123456"; 宏定义中如果包含表达式或变量...在类的头文件中尽量少引用其他头文件 有时,类A需要将类B的实例变量作为它公共API的属性。...GJROrderStatecomplete //已完成 }; 六、安全处理 建议在定义NSArray和NSDictionary时使用类型标注,可以保证程序的安全性: @property (nonatomic
: // LBS的精度选择,如设置10就只保证10米的精度。..._locationManager.desiredAccuracy = kCLLocationAccuracyBest; // LBS的更新距离,如设置10表示,当位置改变超过10米时,会调用位置更新的回调...我们在Info.plist文件中,添加定位权限和相关的权限描述。这样当我们需要使用时,系统就会弹窗,用我们的权限描述来问用户,是否需要打开定位权限。 ?...Info.plist 在Info.plist中完成描述后,我们在调用获取位置的方法时,也要先申请权限。...,使用了Swift,在写完LocationManager后,就涉及到Swift调用OC类的问题。
Swift也不例外,Swift中的数组使用起来还是比较人性化的. 1.数组的声明与创建 在聊Swift中的Array声明创建之前,我想聊一下ObjC中数组的声明与创建,下方是ObjC中不可变数组和可变数组的创建方式...在ObjC中可以使用NSArray来声明不可变数组,使用NSMutableArray来声明可变数组。...Swift中的可变数组的几种方式。...下图是在ObjC中对NSArray操作后的结果,你不能对NSArray中的元素进行修改,也就是说你对NSArray的操作权限只有读的权限,没有写的权限。...在Swift中的可变数组和不可变数组归根结底还是变量和常量也就是var和let关键字的使用了。你对变量持有读写的权限,对常量持有读的权限。
这些关键字可以用于属性、方法返回值和参数中,来指定对象的可空性,这样编写代码的时候就会智能提示。在 Swift 中可以使用!和?...为了安全起见,苹果还制定了以下几条规则: typedef类型的的可空性通常依赖于上下文,即使在 Audited Regions 中也不能假定它为nonnull; 对于复杂的指针类型(如id *)必须明确指定它的可空性...2.编译器将为 weak 修饰的属性生成带 __weak 所有权修饰符的实例变量。...2.编译器将为 unsafe_unretained 修饰的属性生成带 __unsafe_unretained 所有权修饰符的实例变量。...由于属性被声明为NSMutableArray类型,就不避免的会有调用方去调用它的添加对象、移除对象等一些方法,此时由于copy的结果是NSArray不可变对象,对NSArray对象调用添加对象、移除对象等方法
,大家不知道有没有我这个疑问,现在用let var 来给常量变量赋值,那么以前OC那些属性修饰符在swift 是怎么用呢? ...测试打印程序 先定义一个打印对象地址方法: swift4.0打印内存地址的方法是: Unmanaged.passUnretained(obj).toOpaque() swift语言还在改动中,目前已经趋于稳定...,4之前的打印地址内存地址方法:%p ,unsafeaddressof 都以无效。...制作一个单例,然后看看是否使用一块内存。...ReferenceObj() return copyobj; } var name:String = "" var age=0 var friends:NSArray
如何在 Swift3获取类名字符串 解决 Cocoapods不能使用 IBDeisgnable 面向对象思想 ✅为什么要开发 Jekyll-Admin-Mac?...类型,但是我们此时还不存在这个变量。故而强行当做存在的使用崩溃了。 到目前为止,我不清楚这个对象没有初始化是为什么导致的。...如何在 Swift3获取类名字符串。...然而现在一个问题已经出现,现在这么多的配置需要配置岂不是很麻烦。 这就涉及到面向对象思想,但是我们可以在 Swift中使用 Struct作为我们的配置数据源。...⚠️因为结构体没有被引用,所以便利出来的临时变量属于一个新的地址。我们需要修改临时变量之后替换掉之前数组里面的。
不同成员变量进行 KVO。...,非常像常规的NSSet或NSArray。...为3,因为family持有person,person持有family,如果我们运用NSHashTable,则可以完美解决此问题 我们替换1中的代码, + (instancetype)personWithName...,(3+5,6+8)称为逗号表达式,其求解过程先表达式1,后表达式2,整个表达式值是表达式2的值,如:(3+5,6+8)的值是14,a=(a=3 x 5,a x 4)的值是60,而(a=3 x 5,a...name属性 3、自释放 FBKVOController通过自释放的机制来实现observer的自动移除,其实就是给observer的类中添加一个FBKVOController的成员变量,然后在FBKVOController
用的时候就照葫芦画瓢。 现在大伙儿慢慢转向苹果的新开发语言Swift,似乎亦不必花太多时间在Objective-C上。...(Swift有类似的「Computed Properties/计算属性」) 所以,在没有Objective-C2.0的@property之前,我们几乎需要为所有的实例变量,手动写getter和setter...后来,不需要为属性声明实例变量了,@synthesize会默认自动生成一个「下划线+属性名」的实例变量。...所有有mutable(可变)版本的属性类型,如NSString, NSArray, NSDictionary等等——他们都有可变的版本类型:NSMutableString, NSMutableArray...为了更好地和Swift混编(配合Swift的optional类型),在Xcode 6.3,Objective-C新增了一个语言特性,nullability。具体就是以上4个新特性。
strong) NSString *name; @end @interface levelOneModel : NSObject //一级数据 @property (nonatomic, strong) NSArray...Setter的方法把Model层数据传输过去 拿我在以前写的一篇文章中作例子 iOS-NSArray与Model模型 该篇文章中Model层数据通过UITabelView的delegate & dataSource...table.register(UITableViewCell.self, forCellReuseIdentifier:"cell") return table } // UITabel的复用在私有方法中...//Model层私有变量 private var model = [levelModel]() //Presenter层 private let presenter =...: 在Swift的MVP架构模式中P->Presenter是通过Protocol协议来传输数据 protocol levelPresenterDelegate : AnyObject { func
注意 Swift的Array类型与Foundation的NSArray类桥接。...Swift中的数组总是零索引。...您还可以使用下标语法一次更改值范围,即使替换值集的长度与您要替换的范围不同。...Swift的所有基本类型(如String、Int、Double和Bool)默认都是可散列的,并且可以用作设置值类型或字典键类型。默认情况下,没有关联值的枚举案例值(如枚举中所述)也是可散列的。...,Swift可以推断Set是用于favoriteGenres变量的正确类型。
可以通过属性名称传递到成员构造函数中 let vga = Resolution(width: 640, height: 480) 结构体是值类型 值类型是一种当它被指定到常量或者变量,或者被传递给函数时会被拷贝的类型...Swift 中的结构体是值类型,那么它在代码传递中总是被拷贝 //创建一个结构体 let hd = Resolution(width: 1920, height: 1080) //值类型拷贝 var cinema...print("hd is still \(hd.width) pixels wide") 字符串,数组和字典的赋值与拷贝行为 Swift 的 String , Array 和 Dictionary类型是作为结构体来实现的...,这意味着String , Array 和 Dictionary在它们被赋值到一个新的常量或者变量,或它们本身被传递到一个函数或方法中的时候,其实是传递了拷贝。...NSString, NSArray和 NSDictionary,它们是作为类来实现的,所以NSString , NSArray 和 NSDictionary实例总是作为一个引用而不是拷贝来赋值和传递。
默认实现调用每个键值对的setValue:forKey:方法 ,会根据需要用nil替换NSNull对象。...备注: @max和@min根据右键路径指定的属性在集合中搜索,搜索使用compare:方法进行比较,许多基础类 (如NSNumber类) 中都有定义。...数组运算符 根据运算符的条件,将符合条件的对象以一个NSArray实例返回。 @unionOfObjects 读取集合中每个元素的右键路径指定的属性,放在一个NSArray实例中并返回。...@distinctUnionOfArrays 读取集合中的每个集合中的每个元素的右键路径指定的属性,放在一个NSArray实例中,将数组进行去重后返回。...注意: 因为Swift中的所有属性都是对象,所以这里仅适用于Objective-C属性。 当进行赋值如setValue:forKey:时,如果key的数据类型是非对象类型,则value就禁止传nil。
= @"" 对于局部的变量尽量的初始化 局部的变量要初始化 属性有默认的值 所以我们不必须对于属性进行初始化 我之前遇到的一个BUG就是int类型没有初始化给我默认Nan造成崩溃 建议的写法 int...可以精简代码 当执行方法很多 用变量替换 建议的写法 NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults]; [userDefault...(NSArray *)customViews { return @[customView1,customView2]; } @end 非要在自己类的分类添加读写的属性 可以用语法糖 可以利用主类的私有变量...]; } 如果后台返回list为字段 这段代码就崩溃了 可以使用try catch也可以用Model库 或者自己添加判断 使用dispatch_once来创建单例 建议的写法 + (instancetype...数组和字典最好指定元素的类型 建议的写法 NSArray *names = [NSArray array]; 不建议的写法 NSArray *names = [NSArray array
copy一般用在修饰有可变对应类型的不可变对象上,如NSString, NSArray, NSDictionary。...他们遵循的基本原则是:高级别的变量不允许被定义为低级别变量的成员变量。比如一个 private 的 class 中不能含有 public 的 String。...反之,低级别的变量却可以定义在高级别的变量中。比如 public 的 class 中可以含有 private 的 Int。 Open 具备最高的访问权限。...在Swift和Objective-C的混编项目中,如何在Swift文件中调用Objective-C文件中已经定义的方法?如何在Objective-C文件中调用Swift文件中定义的方法?...Swift中,初始化方法必须保证所有optional的成员变量都完成初始化。同时新增convenience和required两个修饰初始化方法的关键词。
UIColor,在iOS中是没有直接的方法初始化的,所以很多时候安卓同学用16进制的iOS的还要RGB就会很麻烦,下面是根据两个类别方法,OC版本的: + (UIColor *)colorWithRGBHex...: self.backgroundColor = UIColor.init(hexString: "F9F9F9") 3、在给一个单色取RGB的UIColor类别方法 OC版本的 Swift...单标卡到底能不能用这个东西我以前也没有确认过,不过最近通过官方渠道确认了一下,在购买开发者账号的时候我们可以看到支付类型就一个visa或者MasterCard两种,然后我们就会找带这两个标识的信用卡来支付...,然后有些成功了有些会遇到支付失败的问题,其实就是这个单标双标的问题或者有没有开通国际支付功能引起的,还有网上有些可以使用苹果支付的完全是没有根据的,下面这两张聊天的截图可以把这个问题说清楚: ?...2、->是访问成员变量,但成员变量默认受保护,所以常常报错,手动设为public即可解决 五: Swift版本的CGD定时器 经常用经常忘记怎么写的我还得经常去查找,记录在这里方便自己查找
领取专属 10元无门槛券
手把手带您无忧上云