是什么区别let,并var在苹果的雨燕语言?
根据我的理解,它是一种编译语言,但它不会在编译时检查类型.这让我感到困惑.编译器如何知道类型错误?如果编译器没有检查类型,那么生产环境是不是有问题?
来自Apple的书"结构和类之间最重要的区别之一是结构在代码中传递时总是被复制,但类是通过引用传递的."
任何人都可以让我理解这意味着什么,对我来说,类和结构似乎是一样的.
在引用具有getter/setter的Java POJO的内部私有变量时,我使用了以下术语:
上面有什么区别吗?如果是这样,使用的正确术语是什么?持有此实体时是否有不同的术语?
我注意到编译器不允许我用另一个存储值覆盖存储的属性(这似乎很奇怪):
class Jedi {
var lightSaberColor = "Blue"
}
class Sith: Jedi {
override var lightSaberColor = "Red" // Cannot override with a stored property lightSaberColor
}
Run Code Online (Sandbox Code Playgroud)
但是,我允许使用计算属性执行此操作:
class Jedi {
let lightSaberColor = "Blue"
}
class Sith: Jedi {
override var lightSaberColor : String{return "Red"}
}
Run Code Online (Sandbox Code Playgroud)
为什么我不允许给它另一个值?
为什么用存储的属性覆盖令人憎恶的东西并用计算的一个犹太教来做?他们在想什么?
Objective-c中的"实例变量"和"属性"之间有区别吗?
我对此不太确定.我认为"属性"是一个具有存取方法的实例变量,但我可能认为错了.
我对在swift中使用static关键字感到有些困惑.正如我们所知,swift引入了let关键字来声明不可变对象.就像声明一个表视图单元的id一样,它最有可能在其生命周期内不会改变.现在什么是在一些struct的声明中使用static关键字:
struct classConstants
{
static let test = "test"
static var totalCount = 0
}
Run Code Online (Sandbox Code Playgroud)
而let关键字也是这样.在Objective C中,我们使用static来声明一些常量
static NSString *cellIdentifier=@"cellId";
Run Code Online (Sandbox Code Playgroud)
除此之外让我更好奇的是使用static关键字以及let和var关键字.谁能解释一下我在哪里使用这个静态关键字?更重要的是我们真的需要swift的静态吗?
我一直认为函数和方法是一样的,直到我通过"Swift编程语言"电子书学习Swift.我发现我不能greet("John", "Tuesday")用来调用我在类中声明的函数,如下面屏幕截图中的电子书所示:

我收到一条错误,说"根据此屏幕截图,错过了参数标签'日:'正在通话中 ":

这是代码: -
import Foundation
import UIKit
class ViewController2: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//var dailyStatement = greet("John", "Tuesday")
var dailyStatement = greet("John", day: "Tuesday")
println(dailyStatement)
}
func greet(name: String, day: String) -> String {
return "Hello \(name), today is \(day)."
}
}
Run Code Online (Sandbox Code Playgroud)
经过一些研究,我发现了这篇文章:方法和函数之间的区别,在我看来,我在类中声明的函数实际上被称为方法.因此,与用于调用函数的语法相比,我用于调用方法的语法是不同的.
我在Objective-C编程时从未意识到这种差异.
Swift中的函数和方法有什么区别?
我们何时使用函数?何时使用Swift中的方法?
Objective-C声明了一个类函数initialize(),在使用之前对每个类运行一次.它经常被用作交换方法实现(混合)等的入口点.
Swift 3.1弃用了这个函数并带有警告:
方法'initialize()'定义了Objective-C类方法'initialize',它不能保证被Swift调用,并且在将来的版本中将被禁止
如何解决这个问题,同时仍保持我目前使用initialize()入口点实现的相同行为和功能?
我的问题是,无论如何我都需要初始化该特定变量,因为还有另一个对象依赖于此变量的值
这是代码(我将变量设置为global)
lazy var getToken = {
if let token = keychain["token"].string {
return token
}
}()
Run Code Online (Sandbox Code Playgroud)
我正在使用惰性,因为无论如何我都需要使用它来进行初始化。
当我尝试将其放在全局文件中时出现此错误错误
'lazy'可能不会在已经很懒惰的global上使用
这是取决于此令牌的对象
单例设计
class SocketIOManager: NSObject {
static let sharedInstance = SocketIOManager()
let socket: SocketIOClient!
private override init() {
super.init()
socket = SocketIOClient(socketURL: URL(string: mainURL)!, .connectParams(["token": getToken])])
}
}
Run Code Online (Sandbox Code Playgroud)
如果你看看socket =在"token",这就是我需要的令牌
swift ×7
objective-c ×2
constants ×1
function ×1
inheritance ×1
ios ×1
java ×1
methods ×1
overriding ×1
pojo ×1
properties ×1
static ×1