变量之间的差异

时间:2018-01-16 10:22:51

标签: swift variables

目前我正在尝试学习Swift。但我不明白

之间的区别
var a : String {return "some text"}

var b : String = "some text"

第一个代码示例是什么?我什么时候使用它?

2 个答案:

答案 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}},也可以在获取之前编辑该值。

<强>参考:

有关详细信息,我建议您查看:

The Swift Programming Language - Properties

答案 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);
    }
}