目前我正在尝试学习Swift。但我不明白
之间的区别var a : String {return "some text"}
和
var b : String = "some text"
第一个代码示例是什么?我什么时候使用它?
答案 0 :(得分:1)
第二个变量var b
被声明为 stored property :
在最简单的形式中,存储属性是常量或变量 存储为特定类或结构的实例的一部分。 存储的属性可以是可变存储属性(已引入 由var关键字)或常量存储属性(由...引入) 让关键字)。
您可以将其视为声明属性的默认方式。
第一个变量var a
被声明为 computed property :
除了存储的属性,类,结构和 枚举可以定义计算属性,但实际上并不是这样 存储一个值。相反,它们提供了一个getter和一个可选的setter 间接检索和设置其他属性和值。
当您需要编辑存储属性的值或甚至根据另一个存储属性获取新类型时,您应该声明一个计算属性。
示例:
struct MyStruct {
// stored properties
var var1: Int
var var2: Int
// comupted properties
var multiplication: Int {
return var1 * var2
}
var result: String {
return "result is: \(multiplication)"
}
}
请记住,计算属性不存储该值,而只是像一个返回类型值的常规函数。
此外,您可以将计算属性视为-private存储属性的 getter-setter ,例如:
struct AccessControlStruct {
private var stored: String
var computed: String {
get {
return stored
}
set {
stored = newValue.trimmingCharacters(in: .whitespaces)
}
}
}
由于stored
被声明为私有,唯一的方法是从结构范围外访问是通过与computed
交谈来设置/获取其值。显然,您可以在设置/从stored
设置/之前对该值进行任何所需的编辑,例如,我将computed
的newValue字符串设置为stored
,然后再将其设置为{{ 1}},也可以在获取之前编辑该值。
<强>参考:强>
有关详细信息,我建议您查看:
答案 1 :(得分:0)
第一个声明是所谓的计算属性。如果有价值的值是计算结果,您可以使用它。但是,在您的示例中,使用一个没有意义。这是一个应该给你这个想法的例子:
@RunWith(MockitoJUnitRunner.class)
public class MyAppTest
{
@Mock
private MyDao myDao;
@Mock
private PostSaveHandler postSaveHandler;
@InjectMocks
private MyApp myApp;
@Test
public void testMyMethod(){
// given
MyDomainClass myObj = new MyDomainClass();
when(myDao.load(anyInt())).thenReturn(myObj);
// when
myApp.myMethod();
ArgumentCaptor<MyDomainClass> argumentCaptor = ArgumentCaptor.forClass(MyDomainClass.class);
verify(myDao).save(argumentCaptor.capture());
assertThat(argumentCaptor.getValue().myInt, is(0));
verify(postSaveHandler).handle(myObj);
}
}