【问题标题】:Is swift let equivalent to objective-c const?swift let 是否等同于objective-c const?
【发布时间】:2017-12-17 11:08:48
【问题描述】:

这是在 Swift 中吗:

let someString:String = "blah"

在 Objective-C 中等效于 this:

NSString * const someString = @"blah";

我一直假设在 Objective-C 中以这种方式使用 const 关键字已经使其在引擎盖下实际上等同于 Swift 中的 let,但是如果听到确认。在 Objective-C 中定义局部变量时很少有人以这种方式使用 const,但它似乎等同于 let。鉴于 let 的好处,确保以后不会发生指针的突变,我想知道我现有的 Objective-C 项目是否不会因为一直使用这个约定而受益。我的问题不是关于 Swift String 和 NSString 之间的区别。

【问题讨论】:

  • 它们是相似的,而不是等价的。 Objective-C(和 C)的情况有点复杂。

标签: objective-c swift


【解决方案1】:

您可以在 Objective-C 中定义 let 和 var。只需保存标头 (swifty.h) 并使用它(#import "swifty.h" 在您需要的地方或添加到 Prefix Header 文件 pch):

#ifndef let
#define let __auto_type const 
#endif

#ifndef var
#define var __auto_type 
#endif

【讨论】:

【解决方案2】:

如果您将const 放在类型之后,如下所示:

NSString * const someString = @"blah"; // your example

struct { int x; int y; } const someStruct = { 42, 24 }; // const value type

那么(Objective-)C 中const 的语义和Swift 中let 的语义是相似的。对于值类型,两者都阻止修改值。对于引用类型,既防止修改引用本身,又允许修改被引用的对象。

如果您将const 放在声明中的其他位置,那么您将进入指向常量的C 指针、常量指针、指向常量的常量指针以及更长的(非)常量组合链的迷宫。不是每个进入这个迷宫的人都会回来……或者至少不是他们的理智完好无损。你被警告了! ;-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-25
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    • 2019-08-18
    • 2019-10-10
    相关资源
    最近更新 更多