Ios 如何使多个协议与一个类相一致,并设计方法来输入和打印细节?
设计一个协议学生,包含数据字段名称、地址、cgpa、课程和学期。创造 另一个协议SportsInfo具有数据字段fav_sports、weight和height。现在设计测试类 哪个符合学生协议和SportsInfo协议,输入和打印细节的设计方法 我试过这样做。但它在接受输入时会引起很多错误Ios 如何使多个协议与一个类相一致,并设计方法来输入和打印细节?,ios,swift,class,protocols,Ios,Swift,Class,Protocols,设计一个协议学生,包含数据字段名称、地址、cgpa、课程和学期。创造 另一个协议SportsInfo具有数据字段fav_sports、weight和height。现在设计测试类 哪个符合学生协议和SportsInfo协议,输入和打印细节的设计方法 我试过这样做。但它在接受输入时会引起很多错误 protocol Student{ var name: String{get} var address: String{get} var cgpa: Double{get}
protocol Student{
var name: String{get}
var address: String{get}
var cgpa: Double{get}
var course: String{get}
var semester: Int{get}
}
protocol SportsInfo{
var fav_sports: String{get}
var weight: Double{get}
var height: Double{get}
}
class Test: Student,SportsInfo{
var name = ""
var address = ""
var cgpa = 0.0
var course = ""
var semester = 0
var fav_sports = ""
var weight = 0.0
var height = 0.0
}
var a=Test()
func takeInputStudentInfo()
{
print("Enter your name:")
a.name = readLine()!
print("Enter your address:")
a.address = readLine()!
print("Enter your CGPA:")
var b=readLine()
a.cgpa = Double(b!)
print("Enter the name of your Course")
a.course = readLine()!
print("Enter which semester are you in:")
a.semester = Int(readLine())
}
func takeInputSportsInfo(){
print("Enter the name of your favorite Sport:")
a.fav_sports = readLine()!
print("Enter your Height:")
a.weight = Double(readLine())
print("Enter your Height:")
a.height = Double(readLine())
}
func printDetails(){
print("Name: \(a.name)")
print("Address: \(a.address)")
print("CGPA: \(a.cgpa)")
print("course: \(a.course)")
print("semester: \(a.semester)")
print("Fav Sport: \(a.fav_sports)")
print("Weight: \(a.weight)")
print("Height: \(a.height)")
}
takeInputStudentInfo()
takeInputSportsInfo()
问题是
readline()
返回一个可选值,Int(someString)
或Double(someString)
也返回一个可选值。但是,您要指定给的属性都不是可选的。因此,需要展开两次才能获得所需的类型
您可以使用感叹号来执行此操作,但是,尽管它会编译,但它迟早会使您的程序崩溃:
var b=readLine()
a.cgpa = Double(b!)! // this compiles, but is it a good idea?
更好的办法是了解Optionals以及如何安全地打开它们。你应该从一开始就养成良好的语言和思维习惯
if let b = readLine() {
if let d = Double(b) {
a.cgpa = d
}
}
这种方法的一个好处是,if
让你说else
。如果无法从用户输入的内容中派生出双精度,则可以打印警告并再次循环,直到获得正确的双精度。您需要编写一个实用程序例程来实现这一点。下面是这样一个例行程序的运行方式:
func getDoubleFromUser(_ message:String) -> Double {
var result : Double?
while result == nil {
print(message)
if let s = readLine(), let d = Double(s) {
result = d
}
}
return result!
}
func getIntFromUser(_ message:String) -> Int {
var result : Int?
while result == nil {
print(message)
if let s = readLine(), let i = Int(s) {
result = i
}
}
return result!
}
现在你可以说
a.cgpa = getDoubleFromUser("Enter your CGPA:")
等等。readLine()
返回可选值String?
,但是来自字符串的双初始值设定项要求它是非可选的
此外,字符串中的Double
初始值设定项返回可选值Double?
(因为并非所有字符串都可以转换为数字),但您试图将其分配给非可选属性
当字符串无法转换为数字时,您需要决定要做什么-是否保留默认值,是否再次询问用户
以下是如何展开可选项的方法,如果它是nil
,请为其指定一些默认值:
print("Enter your Height:")
a.height = Double( readLine() ?? "" ) ?? 0.0
或者离开之前的一切
print("Enter your Height:")
if let inputString = readLine(), let height = Double(inputString) {
a.height = height
}
你也可以在循环中无休止地询问,直到你得到可以转换成数字的正确输入,但我将把它作为练习留给读者