什么是swift更好:一个函数返回一个变量或只是一个getter变量

时间:2016-06-21 16:11:58

标签: ios swift properties

在swift中,我可以创建一个像 -

这样的方法

#1

SecAccessControlRef sacObject = SecAccessControlCreateWithFlags(kCFAllocatorDefault, kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly, kSecAccessControlTouchIDAny, nil);

NSString *localizedReason = NSLocalizedString(@"Authenticate to access app", nil);

LAContext *context = [[LAContext alloc] init];
context.touchIDAuthenticationAllowableReuseDuration = 5;

[context evaluateAccessControl:sacObject operation:LAAccessControlOperationUseItem localizedReason:localizedReason reply:^(BOOL success, NSError *error) {
    if (success) {
        NSDictionary *query = @{(__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword,
                                (__bridge id)kSecAttrService: PASSCODE_KEY,
                                (__bridge id)kSecReturnData: @YES,
                                (__bridge id)kSecUseOperationPrompt: localizedReason,
                                (__bridge id)kSecUseAuthenticationUI: (__bridge id)kSecUseAuthenticationUIAllow,
                                (__bridge id)kSecAttrAccessControl: (__bridge_transfer id)sacObject,
                                (__bridge id)kSecUseAuthenticationContext: context
                                };

        CFTypeRef dataTypeRef = NULL;

        OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)(query), &dataTypeRef);
        // This works when using Touch ID / passcode, but I get errSecAuthFailed when the prompt isn't shown because of the reuse duration.
        if (status == errSecSuccess) {
            NSData *resultData = (__bridge_transfer NSData *)dataTypeRef;
            NSString *result = [[NSString alloc] initWithData:resultData encoding:NSUTF8StringEncoding];
            self.recoveredString = result;

        } else {
            self.recoveredString = @"";
        }
    } else {
        self.recoveredString = @"";
        CFRelease(sacObject);
    }
}];

我也可以这样写 -

#2

func baseURL() -> String {
    #if DEBUG
        return "https://debug.myserver.url.com"
    #else
        return "https://production.myserver.url.com"
    #endif

}

两种方法都满足声明获取属性的要求。就个人而言,我发现第二种方法更好的可读性。

我知道它没有太大区别,但我仍然想知道哪一个更好?这两种方法都有优势吗?

2 个答案:

答案 0 :(得分:4)

  

两种方法都有优势吗?

不在内部,没有。计算属性一个函数,因此在实现中没有区别。

答案 1 :(得分:0)

如果您只是以最少的计算得到一个值,例如您的示例,那么getter是一个不错的选择。

如果获取值可能会进行一些繁重的计算或修改类中的任何成员,那么最好使用函数。