我正在学习Swift,我正在阅读Apple的The Swift Programming Language
,我没有Objective C背景(只有PHP,JS和其他但没有Obj C)
在第24-25页,我看到了这段代码:
//...Class definition stuff...
var perimeter: Double {
get {
return 3.0 * sideLength
}
set {
sideLength = newValue / 3.0
}
}
//...Class continues...
这部分未在书中指明,我无法得到它们的用途。
有人能解释一下获取和设置是什么?
答案 0 :(得分:100)
在类中获取和设置变量是指检索(“获取”)或更改(“设置”)其内容。
考虑类members
的变量family
。当然,这个变量需要是一个整数,因为一个家族永远不能由两个人组成。
所以你可能会继续这样定义members
变量:
class family {
var members:Int
}
然而,这将使使用该课程的人有可能将家庭成员的数量设置为0或1。并且因为没有1或0的家庭,所以这是非常不幸的。 / p>
这就是getter和setter的用武之地。通过这种方式,您可以自己决定如何更改变量以及可以接收哪些值,以及决定返回哪些内容。
回到我们的家庭班,让我们确保没有人可以将members
值设置为小于2的任何值:
class family {
var _members:Int = 2
var members:Int {
get {
return _members
}
set (newVal) {
if newVal >= 2 {
_members = newVal
} else {
println('error: cannot have family with less than 2 members')
}
}
}
}
现在我们可以像以前一样通过输入members
来访问instanceOfFamily.members
变量,并且感谢setter函数,我们也可以像以前一样通过键入来设置它的值,例如:{{1 }}。然而,改变的是,我们不能再将此变量设置为小于2的任何值。
请注意instanceOfFamily.members = 3
变量的引入,该变量是存储我们通过_members
setter函数设置的值的实际变量。原始members
现在已成为计算属性,这意味着它只作为处理我们实际变量的接口。
答案 1 :(得分:31)
在代码之前实际解释过:
除了存储的简单属性外,属性还可以包含getter和setter。
class EquilateralTriangle: NamedShape { ...
当其他一些类想要获取该周长变量时,他们会这样做:
let someVar = myTriangle.perimeter
......这叫做:
get{
return 3.0 * self.sideLength
}
因此,如果呼叫控制器执行此操作,它本质上就像:
let someVar = 3.0 * myTriangle.sideLength
当您从另一个对象设置变量时,它看起来像这样:
myTriangle.perimeter = 100
调用set{}
块中的代码:
set {
sideLength = newValue / 3.0
}
所以,如果设置变量的班级已经这样做了:
myTriangle.sideLength = 100/3.0
这只是为了方便 - 你可以从其他代码中调用它,而不必一直除以或乘以3,因为在设置之前就已经完成了在获得变量之前的变量。
在Swift中,我们可以拥有在获取时计算的属性,并且可以在设置时执行某些操作。我们也可以在Objective-C中做到这一点:
// .h
@property (nonatomic) double perimeter;
//.m
- (double)perimeter
{
return self.sideLength * 3.0;
}
- (void)setPerimeter:(double)perimeter
{
self.perimeter = perimeter; // In Swift, this is done automatically.
self.sideLength = perimeter / 3.0;
}
答案 2 :(得分:15)
一个简单的问题应该是简短明了的答案。
当我们获取该属性的值时,它会触发其get{}
部分。
当我们为属性设置值时,它会触发set{}
部分。
PS。为属性设置值时,SWIFT会自动创建一个名为“newValue”的常量=我们正在设置的值。在属性的set{}
部分中可以访问常量“newValue”之后。
示例:
var A:Int = 0
var B:Int = 0
var C:Int {
get {return 1}
set {print("Recived new value", newValue, " and stored into 'B' ")
B = newValue
}
}
//When we are getting a value of C it fires get{} part of C property
A = C
A //Now A = 1
//When we are setting a value to C it fires set{} part of C property
C = 2
B //Now B = 2
答案 3 :(得分:1)
您应该查看Computed Properties
在您的代码示例中,perimeter
是不由类变量备份的属性,而是使用get
方法计算其值并通过set
方法存储 - 通常引用作为 getter 和 setter 。
当你使用这样的属性时:
var cp = myClass.perimeter
你正在调用get
代码块中包含的代码,当你像这样使用它时:
myClass.perimeter = 5.0
您正在调用set
代码块中包含的代码,其中newValue
会自动填充赋值运算符右侧提供的值。
如果指定了getter和setter,则可以读取计算属性,如果仅指定了getter,则可以读取。
答案 4 :(得分:0)
变量在类中声明并调用
public class ScreenSlidePageFragment extends Fragment {
private Button button1,button2,button3,button4;
static private int turn=0;
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v1=(ViewGroup) inflater.inflate(R.layout.fragment_screen_slide_page1, container, false);
View v2= (ViewGroup) inflater.inflate(R.layout.fragment_screen_slide_page2, container, false);
button1=v1.findViewById(R.id.button1);
button2=v1.findViewById(R.id.button2);
button3=v1.findViewById(R.id.button3);
button4=v2.findViewById(R.id.button4);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
button2.setPressed(false);
button2.setSelected(false);
button3.setPressed(false);
button3.setSelected(false);
button4.setSelected(true);
button4.setPressed(true);
button1.setSelected(true);
button1.setPressed(true);
}
});
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
button3.setPressed(false);
button3.setSelected(false);
button4.setSelected(false);
button4.setPressed(false);
button1.setSelected(false);
button1.setPressed(false);
button2.setPressed(true);
button2.setSelected(true);
}
});
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
button2.setPressed(false);
button2.setSelected(false);
button4.setSelected(false);
button4.setPressed(false);
button1.setSelected(false);
button1.setPressed(false);
button3.setPressed(true);
button3.setSelected(true);
}
});
button4.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
button2.setPressed(false);
button2.setSelected(false);
button3.setPressed(false);
button3.setSelected(false);
button1.setSelected(false);
button1.setPressed(false);
button4.setSelected(true);
button4.setPressed(true);
}
});
if (turn == 0) {
turn=1;
return v1;
}
else
{
turn = 0;
return v2;
}
}
}
现在您要编程以使x的默认值大于或等于3。现在假设假设的情况是,如果x小于3,则您的程序将失败。因此,您希望人们输入3或大于3。Swift为您提供了便利,并且了解这种对变量值进行日期排序的先进方法非常重要,因为它们将广泛用于iOS开发中。现在让我们看看如何在这里使用get和set。
class X {
var x: Int = 3
}
var y = X()
print("value of x is: ", y.x)
//value of x is: 3
如果您仍然有疑问,请记住,get和set的使用是按照我们希望其更新的方式来更新任何变量。获取和设置将使您更好地控制规则。功能强大的工具因此不容易理解。