随着Xcode 8的发布,swift 3.0终于来了。又有一大批api名字发生了变化。但是感觉3.0之后的变化应该会小些,因此再重新仔细学习一下。


1. 关于swift引入的Computed Properties概念。

今天看了Salesforce的sdk,发现了如下的demo代码:

#import "SObjectData.h"

@interface SampleRequestSObjectData : SObjectData

@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *contactId;
@property (nonatomic, copy) NSString *contactName;
@property (nonatomic, copy) NSString *productId;
@property (nonatomic, copy) NSString *productName;
@property (nonatomic, copy) NSString *deliveryDate;
@property (nonatomic, copy) NSNumber *quantity;
@property (nonatomic, copy) NSString *status;
@property (nonatomic, copy) NSDictionary *authorizedUsers;
@property (nonatomic, copy) NSArray *userRecords;
@property (nonatomic, copy) NSArray *attachments;

@end

//
//  SampleRequestSObjectData.m
//  SFDCOfflinePoc
//
//  Created by PAULO VITOR MAGACHO DA SILVA on 1/24/16.
//  Copyright © 2016 Topcoder Inc. All rights reserved.
//

#import "SampleRequestSObjectData.h"
#import "SampleRequestSObjectDataSpec.h"
#import "SObjectData+Internal.h"
#import <SmartSync/SFSmartSyncConstants.h>

@implementation SampleRequestSObjectData

+ (SObjectDataSpec *)dataSpec {
    static SampleRequestSObjectDataSpec *sDataSpec = nil;
    if (sDataSpec == nil) {
        sDataSpec = [[SampleRequestSObjectDataSpec alloc] init];
    }
    return sDataSpec;
}

#pragma mark - Property getters / setters

- (NSString *)name {
    return [self nonNullFieldValue:kSampleRequestNameField];
}

- (void)setName:(NSString *)name {
    [self updateSoupForFieldName:kSampleRequestNameField fieldValue:name];
}

- (NSString *)contactId {
    return [self nonNullFieldValue:kSampleRequestContactField];
}

- (void)setContactId:(NSString *)contactId {
    [self updateSoupForFieldName:kSampleRequestContactField fieldValue:contactId];
}

- (NSString *)contactName {
    return [[self nonNullFieldValue:kSampleRequestContactQueryField] objectForKey:@"Name"];
}

- (NSString *)productId {
    return [self nonNullFieldValue:kSampleRequestProductField];
}

- (void)setProductId:(NSString *)productId {
    [self updateSoupForFieldName:kSampleRequestProductField fieldValue:productId];
}

- (NSString *)productName {
    return [[self nonNullFieldValue:kSampleRequestProductQueryField] objectForKey:@"Name"];
}

- (NSString *)deliveryDate {
    return [self nonNullFieldValue:kSampleRequestDeliveryDateField];
}

- (void)setDeliveryDate:(NSString *)deliveryDate {
    [self updateSoupForFieldName:kSampleRequestDeliveryDateField fieldValue:deliveryDate];
}

- (NSString *)quantity {
    return [self nonNullFieldValue:kSampleRequestQuantityField];
}

- (void)setQuantity:(NSString *)quantity {
    [self updateSoupForFieldName:kSampleRequestQuantityField fieldValue:quantity];
}

- (NSString *)status {
    return [self nonNullFieldValue:kSampleRequestStatusField];
}

- (void)setStatus:(NSString *)status {
    [self updateSoupForFieldName:kSampleRequestStatusField fieldValue:status];
}

- (NSDictionary *)authorizedUsers {
    return [self nonNullFieldValue:kSampleRequestAuthorizedUsersField];
}

- (void)setAuthorizedUsers:(NSDictionary *)authorizedUsers {
    [self updateSoupForFieldName:kSampleRequestAuthorizedUsersField fieldValue:authorizedUsers];
}

- (NSArray *)attachments {
    return [self nonNullFieldValue:kSampleRequestAttachmentsField];
}

- (void)setAttachments:(NSArray *)attachment {
    [self updateSoupForFieldName:kSampleRequestAttachmentsField fieldValue:attachment];
}

- (NSArray *) userRecords {
    int totalSize = [[self.authorizedUsers objectForKey:@"totalSize"] intValue];
    ) {
        return [self.authorizedUsers objectForKey:@"records"];
    }
    return nil;
}

@end

通过代码,可以看出,声明的几个@property 其实没有对每个property对应的真实变量进行读写操作,而是通过自定义的get,set方法对其他的数据进行操作,但是系统会不会自动建立那些没用的真实变量呢?从代码上是看不出了。而且从声明的地方也看不出这些property的特殊性,不注意还真容易误解。

swift的Computed Properties,解决了这个问题:

struct Rect {
    var origin = Point()
    var size = Size()
    var center: Point {
        get {
            let centerX = origin.x + (size.width / )
            let centerY = origin.y + (size.height / )
            return Point(x: centerX, y: centerY)
        }
        set(newCenter) {
            origin.x = newCenter.x - (size.width / )
            origin.y = newCenter.y - (size.height / )
        }
    }
}

这里的center,有自定义的get,set方法,就明确地指出了它的目的不是为了保存一个值,而是“provide a getter and an optional setter to retrieve and set other properties and values indirectly.”

这个写法就比以前的oc写法要好上很多啊!

Swift 学习中的一点体会,不断更新中。。。的更多相关文章

  1. java 学习必备的软件,持续更新中

    小编会持续更新在学习Java过程中需要的软件以及各种文件: 话不多说,看行动! 一:JDK (1)JDK1.8(*64): 链接:https://pan.baidu.com/s/1vM0jNXn2CT ...

  2. 学习java的一点体会

    在这几天的做实验.读书.写笔记的过程中我发现一个问题,就是我的知识面太窄,就比如说,学的知识都是一块一块的,没有能力去把它串起来,虽然学的很快,也写笔记总结,但马上就忘了,我想java是一个体系,需要 ...

  3. 【学习笔记】splay入门(更新中)

    声明:本博客所有随笔都参照了网络资料或其他博客,仅为博主想加深理解而写,如有疑问欢迎与博主讨论✧。٩(ˊᗜˋ)و✧*。 前言 终于学习了 spaly \(splay\) !听说了很久,因为dalao总 ...

  4. Windows批处理命令学习中遇到的坑--持续更新中

    再次拾起windows批处理命令,下边将一些遇到的小问题写出来,希望可以帮到大家 1.set命令:set主要的作用是为变量赋值,类似于编程语言中的var i = Value:但是在使用的过程中一定要注 ...

  5. SqlServer学习-常用的sql语句-持续更新中

    1.获取数据库下的所有表名 select TABLE_NAME from information_schema.tables where TABLE_TYPE='Base TABLE' 2.随机取出1 ...

  6. Vue.js2.0中的变化(持续更新中)

    最近自己在学习Vue.js,在看一些课程的时候可能Vue更新太块了导致课程所讲知识和现在Vue的版本不符,从而报错,我会在以后的帖子持续更新Vue的变化与更新,大家也可以一起交流,共同监督学习! 1. ...

  7. linux工作中遇到的问题总结---更新中

    今天这个,严格来说不算一篇文章,我只想把我工作中遇到的问题分享给大家,让大家少犯错误. 1.安装rmp包时出现错误 :header V3 DSA signature: nokey ,key id .. ...

  8. linux中操作k8s的基本命令-更新中

    linux中操作k8s的基本命令 最近工作中使用到了k8s,那么就来总结下平时使用到的基本的命令 获取某个namespace下的pod 获取某个namespace下的pod,展示出ip和pod信息 查 ...

  9. Kotlin教程——史上最全面、最详细的学习教程,持续更新中....

    关于这个系列教程,我是从最基础的开发环境搭建到项目进阶到后面的项目开发这个过程来写的.我一直秉承从实际项目开发以及源码解析的角度去写好这个教程,并让从未接触过编程的朋友能学好kotlin这门语言.所以 ...

随机推荐

  1. iOS:实现图片的无限轮播(二)---之使用第三方库SDCycleScrollView

    iOS:实现图片的无限轮播(二)---之使用第三方库SDCycleScrollView 时间:2016-01-19 19:13:43      阅读:630      评论:0      收藏:0   ...

  2. C#设计模式(2)——简单工厂模式

    一.概念:简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创 ...

  3. shell及脚本2——shell 环境及命令

    一.快捷键.通配符.特殊符号 1. 快捷键 CTRL+C:终止目前的命令 CTRL+D:输入结束,EOF CTRL+M:ENTER CTRL+S:暂停屏幕输出 CTRL+Q:恢复屏幕输出 CTRL+U ...

  4. 关于iOS特定设别推送(特定用户推送)【原】

    在这里,我就不哆嗦如何制作推送证书之类的了,网上一搜一大堆. 我们现在很多开发者的推送,就是集成第三方的推送SDK,然后通过第三方的推送平台帮我们进行推送.其实,这种推送(如JPush),一般只能广播 ...

  5. uva10635 LIS

    Prince and PrincessInput: Standard Input Output: Standard Output Time Limit: 3 Seconds In an n x n c ...

  6. hibernate处理null 时提示:Property path [...] does notreference a collection

    Hibernate判断某属性不为null 且不可为空时出现Property path [...] does notreference a collection 的问题 处理空的方法: isNotEmp ...

  7. Python 【第五章】:线程、进程和协程

    Python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. #!/usr/bin/env python # -*- coding:utf-8 -*- import t ...

  8. Beta阶段第六次Scrum Meeting

    情况简述 BETA阶段第六次Scrum Meeting 敏捷开发起始时间 2016/12/16 00:00 敏捷开发终止时间 2016/12/17 00:00 会议基本内容摘要 平稳推进 参与讨论人员 ...

  9. HTML5学习总结-番外05 移动终端适配

    一 viewport 在使用移动端设备浏览网页时,移动端浏览器是直接把整个页面放到一个虚拟的视图里来显示的,通常来说这个虚拟的视图大小会比手机屏幕大,用户可以通过手势操作来平移.缩放这个视图. 如果不 ...

  10. UP Board 超详细开箱评测

    前言 原创文章,转载引用务必注明链接. 江浙沪就是好,昨天发货今天收到.另外爱板太省了,外包装小纸箱还是6s钢化膜的重复利用. 注意:拍照自带抖动功能,画质大家凑合着看.冬日天气干燥,手触摸板子前建议 ...