我最初对强行展开和隐式展开非常困惑.现在,以下理解来自我的自学:
有没有可用的隐含解包的动作,但有一些所谓的隐式解开选配.隐式解包的Optionals和普通的Optionals都是Optionals,区别在于访问一个隐式解包的Optional时,你自信地知道底层有一个有效的值并且可以使用.Normal Optionals需要if let绑定或强制unwrapping(!)动作来访问可选变量后面的可能值.
摘要:
强迫去包裹是一个行动的正常选配完成.
隐式解包的Optionals是 Optionals,通常用于类初始化,并在使用时传递没有感叹号的值.
问题:
我对吗?如果我的理解不准确,如果你纠正我,我将不胜感激.
谢谢
一个表达式产生一个值,语句改变机器的状态,也就是副作用。但是,我一直在读那个函数 return 是一个声明。如果我调用一个返回空值的函数,这将如何改变机器的任何状态?或者,如果我调用一个返回非空值的函数,如果我不使用它而只是调用它,这将如何改变任何状态?
我只是不明白为什么返回是一个声明?
资料来源:编程语言中的概念。剑桥:剑桥大学出版社,3.4.1 Statements and Expressions,p。26
当我尝试更改实例的ID属性时byValueObj,我收到一个错误,告诉我无法分配常量的属性,即使属性是变量.但是,我可以在类实例上执行此操作.我知道它可能与by值和引用机制有关.但我对它没有非常明确和正确的理解.有人可以帮我解释一下吗?谢谢.
struct CreatorValue{
var ID = 2201
}
class CreatorRefer{
var ID = 2203
}
let byValueObj = CreatorValue()
let byReferObj = CreatorRefer()
byValueObj.ID = 201 //Error: cannot assign to property: 'byValueObj' is a 'let' constant
byReferObj.ID = 203 //works fine here
Run Code Online (Sandbox Code Playgroud) 到目前为止我的理解:如果定义一个可选变量而不指定任何值,编译器将自动分配nil
代码片段:
A :
var someOptional : Int? //Change to `let` to trigger error
var aDefaultValue = 42
var theAnswer = someOptional ?? aDefaultValue
Run Code Online (Sandbox Code Playgroud)
上面的代码片段工作正常,但是,当我将变量someOptional更改为常量时,编译器大喊错误(请参见下图)
B:
然后我尝试了类似的代码来解决问题.
var someOptional : Int?
print(someOptional)
Run Code Online (Sandbox Code Playgroud)
尽管如此,它仍然适用于变量,而常量类型失败.
结论:
如果你定义一个常量可选,你必须明确指定nil,如果你的意思.因为它看起来没用(为什么你需要一个指定的常量选项nil),如果编译器自动为你做了这个,它可能会引入一个错误.
题:
为什么编译器承担nil对var申报自选但不适合let申报自选项目?
引用指针会间接使用对象的值.但我从来没有真正理解"使用"是什么意思.我开始考虑这个问题,直到我的编译器产生以下代码的错误
int i = 0, *pi = &i;
decltype(*pi) c; // error: 'c' declared as reference but not initialized.
Run Code Online (Sandbox Code Playgroud)
我看了很长时间的错误并搜索了一些我只能给出以下论点的问题.我不知道他们是否正确.
参数1:
1)*p是一个不是变量(或非变量表达式)的表达式
2)取消引用指针表达式产生一个引用,我们实际上是使用一个引用来访问该对象的值
参数2:
仅为其decltype返回引用的解除引用表达式,它不是一般情况
请指出上述论点的任何不正确或不准确的描述.
我的问题是如何初始化具有初始化程序的成员数据,其中构造函数中还有一个默认参数.
class InputPlay {
public:
InputPlay(std::string s = "test" ) : _s(s) { };
private:
std::string _s = "default";
};
Run Code Online (Sandbox Code Playgroud)
问题:
调用构造时,变量_s是否会有2次初始化?又名_s将由字符串文字默认初始化,然后由构造函数中的默认参数"test"替换?
如何评估是否设置了 bash 环境变量
例如
function! Myfoo(arg)
if $SomeVar is set/exist ----> how to eval the SomeVar has been set
....
endif
endfunction
Run Code Online (Sandbox Code Playgroud) 以下代码工作正常
struct carConfi {
var owner: String?
let brand: String = "BMW"
var currentMile: Double = 2000
}
let tomCar = carConfi()
Run Code Online (Sandbox Code Playgroud)
但是,如果我将属性的类型更改owner为常量,则初始化程序将出错
struct carConfi {
let owner: String? // Change to constant
let brand: String = "BMW"
var currentMile: Double = 2000
}
let tomCar = carConfi() //error: missing argument for parameter 'owner' in call
Run Code Online (Sandbox Code Playgroud)
我做了一点搜索,结果是因为可选变量自动具有默认值nil
我猜:因为一旦设置了常量,它就无法更改,如果可选常量自动收到,nil那么它将保持不变nil,非常愚蠢,可能会对用户产生影响
问:我的大学并不完全相信猜测,他告诉我必须有更多理由.如果有人能向我解释,我将非常感激
谢谢
Swift的字符串类型是值类型.如果创建新的String值,则在将String值传递给函数或方法时,或者将其赋值给常量或变量时,将复制该String值.
它被分配给常量或变量时被复制,这对我来说很有意义.但是当传递给函数的值类型变量也会被复制时,这会让我感到困惑.
题
将值类型变量传递给函数时如何复制?什么样的"空间"持有这个副本?它是在场景后面无形地创建的某种临时变量,在函数进程被破坏之后?
谢谢
让我们从代码片段开始:
St Foo {
var proA: Int = 0 { // needs initialization
willSet {
print("about to set proA to \(newValue) from \(proA)")
}
didSet {
print("already set proA to \(proA) from \(oldValue)")
}
}
var ProB: Int { // do not needs initialization
return 1
}
}
let foo = Foo()
foo.proA = 23
print(foo.ProB)
Run Code Online (Sandbox Code Playgroud)
以下是我个人对存储和计算属性的一些理解:
a:只有观察者的属性(willSet 和 didSet)不是计算属性而是存储属性(例如上面代码中的proA属性)。
b:计算属性不能有初始化(见上面代码的注释)。
c: setter 相当于属性观察者,属性观察者只是变异前后的 setter + 观察者。
问题:
1.我想知道是什么使属性成为计算属性?只要该属性有一个 getter 并返回它就是一个计算属性,这是否正确?
2.我的所有理解(a, b & c)都正确吗?如果没有,请您指出来。
3. …
swift ×6
optional ×3
c++ ×2
function ×2
c ×1
c++11 ×1
class ×1
constants ×1
constructor ×1
dereference ×1
pointers ×1
properties ×1
reference ×1
statements ×1
structure ×1
value-type ×1
vim ×1