我有以下swift3代码。 JSON可以返回$ 0 [2]值的NSNull值。
struct Player3 {
let name : String
var score : String
let avatar : String
}
class HistoricLeagueVC: UITableViewController {
var players = [Player3]()
override func viewDidLoad() {
super.viewDidLoad()
let urlString = "https://str8red.com/jsonoverallleaderboard/1025/"
let url = URL(string: urlString)
URLSession.shared.dataTask(with:url!) { (data, response, error) in
if error != nil {
print("there was an error")
} else {
do {
let parsedData = try JSONSerialization.jsonObject(with: data!) as! [[String]]
self.players = parsedData.map { Player3(name: $0[0], score: $0[1], avatar: $0[2]) }
print(self.players.count)
DispatchQueue.main.async {
self.tableView.reloadData()
}
} catch let error as NSError {
print(error)
}
}
}.resume()
}
我试图将其转换为空字符串但没有成功。我还尝试设置一个默认字符串,例如"https://str8red.com/static/no_profile_picture.png"
,理想情况下我想这样做。
终端中的错误说明Could not cast value of type 'NSNull' (0xed1c78) to 'NSString' (0x57b6b8).
任何帮助都将不胜感激。
答案 0 :(得分:0)
不要强制转换为<?php
if (isset($_POST['submit'])) { // Checking for submit form
$my_email = 'roni.itzhaik@gmail.com'; // Change with your email address
if ($_POST['submit'] == 'add') {
$name = trim(strip_tags(addslashes($_POST['name'])));
$email = trim(strip_tags(addslashes($_POST['email'])));
$message = trim(strip_tags(addslashes($_POST['message'])));
$phone = trim(strip_tags(addslashes($_POST['phone'])));
$pattern_name = '/^[a-zA-Z]{2}/';
$pattern_email = '/^[^\W][a-zA-Z0-9_]+(\.[a-zA-Z0-9_]+)*\@[a-zA-Z0-9_]+(\.[a-zA-Z0-9_]+)*\.[a-zA-Z]{2,4}$/';
$pattern_message = '/^[a-zA-Z0-9]{2}/';
$pattern_phone = '/^([0-9]{9,10})/';
if ($email != '' && $message != '' && $phone != ''&& $name != '') {
if (preg_match($pattern_email, $email)&& preg_match($pattern_name, $name)&& preg_match($pattern_message, $message)&& preg_match($pattern_phone, $phone) ) {
$headers = 'From: ' . $email . "\r\n";
$subject = 'Message from ' . $name;
$message_phone= $message.'Phone number: '.$phone;
mail($my_email, $subject, $message_phone, $headers);
echo 'success|<div class="alert alert-success"><button type="button" class="close" data-dismiss="alert"><i class="ion-close"></i></button>Thank you! We will contact you shortly.</div>';
}
elseif(!preg_match($pattern_email, $email)) {
echo 'error|<div class="email_error"></i></button>Please enter a valid email address.</div>';
}
elseif(!preg_match($pattern_name, $name)) {
echo 'error|<div class="alert alert-danger"><button type="button" class="close" data-dismiss="alert"><i class="ion-close"></i></button>Name must be more then 2 letters.</div>';
}
elseif(!preg_match($pattern_phone, $phone)) {
echo 'error|<div class="phone_error"></i></button>Phone must be 9-10 digits.</div>';
}
elseif(!preg_match($pattern_message, $message)) {
echo 'error|<div class="alert alert-danger"><button type="button" class="close" data-dismiss="alert"><i class="ion-close"></i></button>Message must be more than 2 letters.</div>';
}
} elseif ($name== ''&& $message != '' && $phone != '' && $email != '') {
echo 'error|<div class="alert alert-danger"><button type="button" class="close" data-dismiss="alert"><i class="ion-close"></i></button>Please fill name</div>';
}
elseif ($phone== ''&& $message != '' && $name != '' && $email != '') {
echo 'error|<div class="alert alert-danger"><button type="button" class="close" data-dismiss="alert"><i class="ion-close"></i></button>Please fill Phone number</div>';
}
elseif ($message== '' && $phone != ''&& $name != '' && $email != '') {
echo 'error|<div class="alert alert-danger"><button type="button" class="close" data-dismiss="alert"><i class="ion-close"></i></button>Please fill Massage</div>';
}
elseif ($email== ''&& $message != '' && $phone != ''&& $name != '') {
echo 'error|<div class="alert alert-danger"><button type="button" class="close" data-dismiss="alert"><i class="ion-close"></i></button>Please fill Email address</div>';
}
else{
echo 'error|<div class="alert alert-danger"><button type="button" class="close" data-dismiss="alert"><i class="ion-close"></i></button>Please fill all the fields</div>';
}
}
} else { // Submit form false
header('Location: index.html');
}
?>
:
<form class="x-contact-form" style="max-width: 300px; margin: 10px">
<div class="form-group name-group">
<label>Name</label>
<input class="form-control" name="name" data-rule="required|min:2|max:254"
/>
<span id="name_error" class="text-danger"></span>
</div>
<div class="form-group email-group">
<label>Email</label>
<input class="form-control" name="email" data-rule="required|email|max:254"
/>
<span id="email_error" class="text-danger"></span>
</div>
<div class="form-group phone-group">
<label>Phone</label>
<input class="form-control" name="phone" data-rule="required|min:9|max:10"
/>
<span id="phone_error" class="text-danger"></span>
</div>
<div class="form-group message-group">
<label>Message</label>
<textarea class="form-control" name="message" data-
rule="required|min:2|max:254"></textarea>
<span id="message_error" class="text-danger"></span>
</div>
<input type="submit" class="btn btn-primary" id="btn" value="Send" />
</form>
你甚至应该[[String]]
以更安全的方式做事(使用let parsedData = try JSONSerialization.jsonObject(with: data!) as! [[Any]]
self.players = parsedData.map { Player3(
name: ($0[0] as? String) ?? "",
score: ($0[1] as? String) ?? "",
avatar: $0[2] as? String, // keeping `nil` here
)}
),但上述方法可行。
答案 1 :(得分:0)
如果您的输入数据出现任何问题,您的代码将会崩溃。问问你的老板他或她是否还好。我不会。以下是崩溃的方法:如果data == nil(但不应该是error == nil)。您可以发现无法在不崩溃的情况下解析数据的问题。如果数据不解析为数组,则崩溃,如果数组的元素不是所有数组,则崩溃,如果内部数组中的元素不是所有字符串,则崩溃,如果任何内部数组包含两个,则崩溃或更少的字符串。我认为这是非常不可接受的。
我的策略是:如果无法解析响应或不是数组数组,则忽略它,保持self.players不变。如果有一个数组数组,重置self.players,然后为每个包含至少三个项目的数组添加一个播放器,其中前两个必须是字符串。
guard data != nil else { return }
guard let parsed = try? NSJSONSerialization(with: data!) else { return }
guard let arrays = parsed as? [[Any]] else { return }
self.players.removeAll()
for array in arrays {
guard array.count >= 3,
let name = array [0] as? String,
let score = array [1] as? String else { continue }
let avatar = array [2] as? String ?? ""
self.players.append(Player3 (name: name, score: score, avatar: avatar))
}
将这样的东西移到一个单独的方法中是个好主意。添加您认为合适的错误处理或日志记录。