Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何使多个协议与一个类相一致,并设计方法来输入和打印细节?_Ios_Swift_Class_Protocols - Fatal编程技术网

Ios 如何使多个协议与一个类相一致,并设计方法来输入和打印细节?

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}

设计一个协议学生,包含数据字段名称、地址、cgpa、课程和学期。创造 另一个协议SportsInfo具有数据字段fav_sports、weight和height。现在设计测试类 哪个符合学生协议和SportsInfo协议,输入和打印细节的设计方法

我试过这样做。但它在接受输入时会引起很多错误

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
}
你也可以在循环中无休止地询问,直到你得到可以转换成数字的正确输入,但我将把它作为练习留给读者